Fix XMLSyntaxError "Namespace prefix mailto for dade on a is not defined" in convert_html_to_xml step 30#160
Fix XMLSyntaxError "Namespace prefix mailto for dade on a is not defined" in convert_html_to_xml step 30#160
Conversation
…rees Agent-Logs-Url: https://github.com/scieloorg/scielo_migration/sessions/807d21a0-f07d-4b7f-9102-fcce21174c55 Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
|
|
||
| def load_html(content): | ||
| return fromstring(wrap_html(content)) | ||
| tree = fromstring(wrap_html(content)) |
There was a problem hiding this comment.
@copilot provavelmente esta solução não funciona porque o conteúdo original tem que ser corrigido antes de tentar gerar o html
There was a problem hiding this comment.
Boa observação. Adicionei remove_invalid_namespace_prefix_attributes no fix() para corrigir o conteúdo original (string) antes da geração do HTML, mantendo a limpeza no nível da árvore como rede de segurança (commit 6d9b31f).
Reproduzi o cenário que de fato falhava na pipeline (steps 10 → 20 → 30): quando o valor do atributo contém <, p.ex. <a mailto:dade="a<b" href="z">, o remove_namespaces_from_content existente é enganado pelo parser textual e o atributo malformado chega ao step 30, onde o ET.fromstring levanta o XMLSyntaxError. Com o novo passo no fix(), o conteúdo original passa a ser sanitizado antes do fromstring, e a pipeline completa o step 30 corretamente.
…HTML generation Agent-Logs-Url: https://github.com/scieloorg/scielo_migration/sessions/3cb06e98-1827-4e85-96a2-b2ed33363233 Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
O que esse PR faz?
Corrige o
XMLSyntaxError: Namespace prefix mailto for dade on a is not definedque abortaconvert_html_to_xml_step_30_embed_html(e cascateia paraXML Status BLOCKEDno Article Proc) quando o HTML de origem traz atributos malformados com prefixo de namespace não declarado, p.ex.<a mailto:dade="...">.A correção é aplicada em duas camadas (defesa em profundidade), priorizando a sanitização do conteúdo original antes da geração do HTML:
fix()) — Adicionaremove_invalid_namespace_prefix_attributes(content)emscielo_classic_website/htmlbody/html_fixer.py, invocada como passo dofix(). Remove apenas o atributo malformado (preservando a tag<a>e os demais atributos), corrigindo o conteúdo original antes quewrap_html/fromstringsejam chamados. Robusto a valores de atributo contendo<— caso em que oremove_namespaces_from_contentexistente é enganado pelo splitter textual.remove_invalid_namespace_attributes(tree)emscielo_classic_website/htmlbody/html_fixer.py: percorre a árvore lxml e remove atributos cujo nome contém:mas o prefixo não está declarado. Invocada emload_htmleget_fixed_htmlcomo rede de segurança após o parsing, cobrindo ambos os caminhos usados porHTMLContent→html_to_node→MainHTMLPipe.xml/xlinke atributos já mapeados em notação Clark ({uri}localname).TestRemoveInvalidNamespaceAttributeseTestRemoveInvalidNamespacePrefixAttributesemtests/test_html_fixer.py(15 casos novos, incluindo o cenário em que o valor do atributo contém<ou>— casos em que a limpeza textualremove_namespaces_from_contentfalha).Onde a revisão poderia começar?
scielo_classic_website/htmlbody/html_fixer.py— começar pela funçãoremove_invalid_namespace_prefix_attributes(string-level) e sua chamada no pipeline dofix(); em seguidaremove_invalid_namespace_attributes(tree-level) e suas chamadas emload_html/get_fixed_html.Como este poderia ser testado manualmente?
Ou rodar
pytest tests/test_html_fixer.py.Validação ponta-a-ponta da pipeline (steps 10 → 20 → 30) confirmou que o input que reproduzia o erro original (
<a mailto:dade="a<b" href="z">) agora é processado semXMLSyntaxError.Algum cenário de contexto que queira dar?
lxml.html.fromstringaceitamailto:dadecomo nome literal de atributo. Quando o<body>parseado é inserido no XML do artigo e re-serializado porEndPipe, oStartPipedo step 30 chamaET.fromstring(...)(parser XML estrito), que interpretamailto:como prefixo de namespace inexistente e levantaXMLSyntaxError.A limpeza textual existente (
remove_namespaces_from_content) é frágil porque opera sobre tokens delimitados por</>: quando o valor do atributo contém um desses caracteres, ela falha em identificar o atributo malformado e ele chega intacto ao step 30. Por isso o conteúdo original é sanitizado primeiro peloremove_invalid_namespace_prefix_attributes(string-level), que remove apenas o atributo problemático mantendo a tag, e oremove_invalid_namespace_attributes(tree-level) atua como uma segunda barreira após o parsing.Screenshots
N/A.
Quais são tickets relevantes?
Issue reportada em
scieloorg/scielo_migrationreferente à tarefamigrate_and_publish_articlescomXML Status BLOCKEDe tracebacklxml.etree.XMLSyntaxError: Namespace prefix mailto for dade on a is not defined.Referências
remove_ms_office_conditionals) e PR Fix XMLSyntaxError caused by invalid HTML comments (clipboard artifacts) in HTML→XML conversion #153 (remove_invalid_xml_comments).