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

时间:2018-10-12 14:33:23

标签: java html xml xpath xhtml

我想完成一个简单的任务,但是我正在努力找到一个简单的解决方案:我将网页的HTML包含在String(或File)中,并且我想生成给定的XPath元件。 (例如,我想检索<a>元素的XPath)

我尝试了不同的解决方案,但在正确解析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。 如果只有我可以正确地以编程方式解析html,我喜欢与jOOX进行交互的方式。您知道解析HTML的好方法吗? 我已经尝试过:

  • JSoup
  • Tagsoup
  • HtmlCleaner

测试网站页面为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);

事实是<a href="cinema.shtml">Cinema</a>之类的标签变成了<a>Cinema</a>,因此我无法使用它们的属性(例如href)来选择它们。我该如何解决这个新问题?

我注意到某些链接仍然具有href,它们是指向其他网站(如facebook或twitter)的链接。这可能有关吗?

1 个答案:

答案 0 :(得分:0)

已解决

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

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 库一起使用。