jsoup parse attribute=“值”=“”

p5fdfcr1  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(434)

我的用例

从网站下载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 "/>".
5m1hhzi4

5m1hhzi41#

jsoup包括一个到w3cdom模型的转换器,其中包括转换时的属性过滤。然后可以直接对该对象运行xpath查询,这不仅有效,而且比序列化为xml然后重新解析它更有效。
请参阅org.jsoup.helper.w3cdom的文档
举个例子:

import org.w3c.dom.Document;
import org.w3c.dom.Node;
...

String html = "<div someattribute=\"somevalue\"=\"\"></div>";
org.jsoup.nodes.Document jdoc = Jsoup.parse(html);
Document w3doc = W3CDom.convert(jdoc);

String query = "//div";
XPathExpression xpath = XPathFactory.newInstance().newXPath().compile(query);
Node div = (Node) xpath.evaluate(w3doc, XPathConstants.NODE);

System.out.printf("Tag: %s, Attribute: %s",
        div.getNodeName(),
        div.getAttributes().getNamedItem("someattribute"));

(注意 Document 以及 Node 这里是w3cdom,而不是jsoupdom。)
这给了我们:

Tag: div, Attribute: someattribute="somevalue"

相关问题