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 ';'
...
这似乎是带有查询参数的 URL 中使用 & 字符的问题,xmllint 想要将其解释为实体引用,然后抱怨,因为 XML 中的实体引用必须以分号字符终止(与 SGML 不同,其中分号是仅当后续字符是名称字符时才需要)。您可以尝试 xmllint 的“-noent”选项,但我不相信 xmllint 可以被告知忽略实体引用,并建议使用其他工具将 HTML 转换为 XML,例如“sgmlproc”,如我的解析 HTML 教程中所述。此处详细讨论了与符号的处理,并涉及使用 HTML DTD,其中声明了 href 和其他 URL 类型的属性,以便不识别任何实体引用。
很抱歉这么长的回答和自我推销,但我知道没有更好的解决方案来解决您的问题。我原本打算将此作为评论,但空间不足。
这供将来参考:事实证明,将“&”编码为实体可以解决中文期刊中特定 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)/&/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&fu=0&bar=0">fubar</a>