`-:55:HTML 解析器错误:htmlParseEntityRef:期待 ';'`:使用 xmllint 清理 HTML 文件?

问题描述 投票:0回答:2

http://journals.im.ac.cn/cjbcn/ch/reader/view_abstract.aspx?file_no=gc19010159&flag=1

我想清理上述 URL 中的文件。但 xmllint 给出以下错误。有人知道如何解决这个问题吗?谢谢。

$ xmllint -html -xmlout file.html
-:55: HTML parser error : htmlParseEntityRef: expecting ';'
ges/dh-img.jpg"><A href="../common_item.aspx?parent_id=20070610225413001&menu_id
                                                                               ^
-:55: HTML parser error : htmlParseEntityRef: expecting ';'
on_item.aspx?parent_id=20070610225413001&menu_id=20070610225740001&is_three_menu
                                                                               ^
-:55: HTML parser error : htmlParseEntityRef: expecting ';'
ges/dh-img.jpg"><A href="../common_item.aspx?parent_id=20070610225449001&menu_id
                                                                               ^
-:55: HTML parser error : htmlParseEntityRef: expecting ';'
on_item.aspx?parent_id=20070610225449001&menu_id=20171222045531778&is_three_menu
                                                                               ^
-:55: HTML parser error : htmlParseEntityRef: expecting ';'
ges/dh-img.jpg"><A href="../common_item.aspx?parent_id=20070610225428001&menu_id
                                                                               ^
-:55: HTML parser error : htmlParseEntityRef: expecting ';'
...
xml xml-parsing tidy xmllint htmltidy
2个回答
0
投票

这似乎是带有查询参数的 URL 中使用 & 字符的问题,xmllint 想要将其解释为实体引用,然后抱怨,因为 XML 中的实体引用必须以分号字符终止(与 SGML 不同,其中分号是仅当后续字符是名称字符时才需要)。您可以尝试 xmllint 的“-noent”选项,但我不相信 xmllint 可以被告知忽略实体引用,并建议使用其他工具将 HTML 转换为 XML,例如“sgmlproc”,如我的解析 HTML 教程中所述。此处详细讨论了与符号的处理,并涉及使用 HTML DTD,其中声明了 href 和其他 URL 类型的属性,以便不识别任何实体引用。

很抱歉这么长的回答和自我推销,但我知道没有更好的解决方案来解决您的问题。我原本打算将此作为评论,但空间不足。


0
投票

这供将来参考:事实证明,将“&”编码为实体可以解决中文期刊中特定 HTML 文件中的 htmlParseEntityRef 问题。

下面是一个简单的示例,说明了通过 perl 的解决方法:

$ cat bad-simple.html 
<!DOCTYPE HTML>
<html lang="en">
  <head>
    <title>bad URL links </title>
  </head>
  <body>
    <a href="http://www.fubar.com?fubar=1&fu=0&bar=0">fubar</a>
  </body>
</html>
$ 
$ xmllint --html --noout bad-simple.html
bad-simple.html:7: HTML parser error : htmlParseEntityRef: expecting ';'
    <a href="http://www.fubar.com?fubar=1&fu=0&bar=0">fubar</a>
                                            ^
bad-simple.html:7: HTML parser error : htmlParseEntityRef: expecting ';'
    <a href="http://www.fubar.com?fubar=1&fu=0&bar=0">fubar</a>
                                                  ^
$ perl -pe 's/\&(?!amp)/&amp;/g;' bad-simple.html >| better-simple.html
$ xmllint --html --noout better-simple.html
$ 
$ diff bad-simple.html better-simple.html 
7c7
<     <a href="http://www.fubar.com?fubar=1&fu=0&bar=0">fubar</a>
---
>     <a href="http://www.fubar.com?fubar=1&amp;fu=0&amp;bar=0">fubar</a>

© www.soinside.com 2019 - 2024. All rights reserved.