【发布时间】:2021-04-14 09:56:12
【问题描述】:
我的用例
- 从网站下载 HTML 文件
- 用 JSoup 解析它
- 使用 JSoup 将其转换为有效的 XML
- 使用 XPath (javax.xml.xpath) 从该 XML 文档中读取元素和属性
(这在大多数情况下已按预期实现和工作。)
问题/原因
有一种情况失败:
- 源 HTML 文件包含类似
<div someattribute="somevalue"=""></div>的无效内容 - JSoup 将其转换为同样无效的字符串
<div someattribute="somevalue" =""=""></div> - XPath 无法解析无效的 JSoup 输出 XML。
问题和解决方法
- 是否可以给 JSoup 一个提示,以便它为这个无效输入生成有效输出?
- 是否可以给 XPath 一个提示,以便它解析无效输入(=JSoup 输出)?
- 是的,作为后备,我可以将无效的
"=""从 HTML 字符串中过滤出来,并将其替换为",但是当有一个可以解析无效 HTML 的库时,为什么要自己做呢!?
技术细节
不幸的是,我想通过 JSoup 解析的 HTML 文档包含类似 sn-p 的内容:
<div someattribute="somevalue"=""></div>
使用此配置调用 JSoup ...
Document doc = Jsoup.parse(html);
doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml).charset(StandardCharsets.UTF_8);
String html = doc.html();
... 返回一个包含这个 sn-p 的 HTML 文档:
<div someattribute="somevalue" =""=""></div>
XPath 然后使用以下消息中止解析该文档:
Auf Elementtyp "div" müssen entweder Attributspezifikationen, ">" oder "/>" folgen.
英文是这样的:
Element type "div" must be followed by either attribute specifications, ">" or "/>".
【问题讨论】:
-
感谢您的问题和详细信息。我在下面提供了一个解决方案,并在 jsoup 中提出了一个问题 (github.com/jhy/jsoup/issues/1474) 以跟踪确保 jsoup 的 XML 输出在这种情况下是有效的。