如何在 java 中获取 HTML 中元素的 XPath?

How to get the XPath of an element in HTML in java?

提问人:L. Don 提问时间:10/12/2018 最后编辑:Jason AllerL. Don 更新时间:12/19/2022 访问量:2691

问:

我想完成一个简单的任务,但我正在努力找到一个简单的解决方案:我在字符串(或文件)中有一个网页的 HTML,我想生成给定元素的 XPath。 (例如,我想检索元素的 XPath)<a>

我尝试了不同的解决方案,但我在正确解析html时经常遇到问题。有没有像这样有效的 java html 清理器?https://www.htmlwasher.com/这是我目前发现的唯一功能清洁器,但它是一个在线工具。有了这个,我可以轻松解析 HTML 并获取 XPath。

我目前正在以这种方式使用 jOOX (https://github.com/jOOQ/jOOX) 来生成 XPath:

Document document = $(html).document();
System.out.println($(document).find("a").xpath());

如果使用我提供的在线工具清理 HTML,我可以生成正确的 XPath。 我喜欢与 jOOX 交互的方式,只要我能正确且以编程方式解析 html。你知道解析 HTML 的好方法吗? 我已经试过了:

  • JSoup
  • 标签oup
  • Html清洁工

测试网站页面已 http://www.ansa.it

编辑: 解析在一些常见的 HTML 解析问题上失败,例如未关闭的标签(例如)、转义等。</img>

我设法以这种方式“正确”解析html:

    Document doc = Jsoup.parse(Jsoup.clean(html, Whitelist.relaxed()));
doc.outputSettings().escapeMode(EscapeMode.xhtml)
                        .syntax(Syntax.xml)
                        .charset(StandardCharsets.UTF_8);

事实是,像 become 这样的标签,所以我无法使用它们的属性(如 href)来选择它们。我该如何解决这个新问题?<a href="cinema.shtml">Cinema</a><a>Cinema</a>

我注意到一些链接仍然有它们的 href,它们是指向 Facebook 或 Twitter 等其他网站的链接。这可能与此有关吗?

java html , xml xpath xhtml

评论

0赞 aglassman 10/12/2018
在未清洁时,它特别失败了什么?
0赞 L. Don 10/13/2018
我编辑了问题!@aglassman顺便说一句,我在一些未关闭的标签上失败了,<!DOCTYPE>不允许的,诸如此类。我设法让它清理 html,但发生了一些奇怪的事情:许多 <a> 标签丢失了它们的 href 属性!

答:

0赞 L. Don 10/13/2018 #1

已解决

我设法让所有事情都以这种方式工作:

String html = getTheHTMLSomeWay();

Document doc = Jsoup.parse(Jsoup.clean(html, "http://base.uri", Whitelist.relaxed().preserveRelativeLinks(true)));
doc.outputSettings().escapeMode(EscapeMode.xhtml).syntax(Syntax.xml).charset(StandardCharsets.UTF_8);

org.w3c.dom.Document document = $(doc.html()).document();

System.out.println($(document).find("a[href='/your/relative/url']"));

使用 Jsoup,我可以清理 HTML 中所有无聊的未关闭标签、不允许的标签等。然后我可以转义所有未转义的字符(根据 xhtml)并将语法设置为 xml

这可以给你一个干净的html代码,可以与jOOX库一起使用。