我的用例
从网站下载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 output)?
是的,作为后备,我可以过滤无效的 "=""
并将其替换为 "
,但是当有一个库可以解析无效的html时,为什么还要自己去做呢!?
技术细节
不幸的是,我想让jsoup解析的html文档包含如下代码片段:
<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();
... 返回包含以下代码段的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 "/>".
1条答案
按热度按时间5m1hhzi41#
jsoup包括一个到w3cdom模型的转换器,其中包括转换时的属性过滤。然后可以直接对该对象运行xpath查询,这不仅有效,而且比序列化为xml然后重新解析它更有效。
请参阅org.jsoup.helper.w3cdom的文档
举个例子:
(注意
Document
以及Node
这里是w3cdom,而不是jsoupdom。)这给了我们: