当前位置: 首页 > 面试题库 >

在Java中针对HTML使用XPath包含

聂炜
2023-03-14
问题内容

我正在使用Java程序内的XPath从HTML页面抓取值以获取特定标签,并偶尔使用正则表达式来清理接收到的数据。

经过一番研究,我找到了HTML
Cleaner(http://htmlcleaner.sourceforge.net/)作为将原始HTML解析为良好XML格式的最可靠方法。但是,HTML
Cleaner仅支持XPath 1.0,我发现自己需要“包含”之类的功能。例如,在这段XML中:

<div>
  <td id='1234 foo 5678'>Hello</td>
</div>

我希望能够使用以下XPath获得文本“ Hello”:

//div/td[contains(@id, 'foo')]/text()

有什么办法可以获得此功能?我有几个想法,但是如果我不需要:

  • 如果有一种方法可以调用HTML Cleaner的validateXPath并返回一个TagNode(我没有找到),则可以在返回的TagNode上使用XML序列化器,并将XPath链接在一起以实现所需的功能。
  • 我可以使用HTML Cleaner将其清理为XML,将其序列化为字符串,然后将其与另一个XPath库一起使用,但是找不到适合字符串的Java XPath评估器。
  • 使用诸如getElementsByAttValue之类的TagNode函数,我基本上可以重新创建XPath评估并使用String.contains插入包含功能。

简短的问题:有什么方法可以在现有Java库中的HTML上使用XPath包含的内容?


问题答案:

关于此:

我可以使用HTML Cleaner将其清理为XML,将其序列化为字符串,然后将其与另一个XPath库一起使用,但是找不到适合字符串的Java
XPath评估器。

正是 我所要做的(除非您不需要对字符串进行操作(请参见下文))。

许多HTML解析器 试图做太多事情 。例如,HTMLCleaner不能正确/完全实现XPath 1.0规范(contains例如,
是XPath 1.0函数)。好消息是您不需要它。您只需HTMLCleaner即可解析格式错误的输入。完成此操作后,最好 使用标准XML接口
来处理生成的(现在格式正确的)文档。

首先将文档转换成这样的标准org.w3c.dom.Document

TagNode tagNode = new HtmlCleaner().clean(
        "<div><table><td id='1234 foo 5678'>Hello</td>");
org.w3c.dom.Document doc = new DomSerializer(
        new CleanerProperties()).createDOM(tagNode);

然后使用标准的JAXP接口对其进行查询:

XPath xpath = XPathFactory.newInstance().newXPath();
String str = (String) xpath.evaluate("//div//td[contains(@id, 'foo')]/text()", 
                       doc, XPathConstants.STRING);
System.out.println(str);

输出:

Hello


 类似资料:
  • 问题内容: 谁能推荐我一个Java库来允许我通过URL进行XPath查询?我尝试JAXP失败。 谢谢。 问题答案: jsoup,Java HTML Parser非常类似于jQuery语法方式。

  • 问题内容: 我想获取数据并在没有标签的情况下进行整理。看起来像这样 并且我希望能够提取所有信息字符串,以便可以使用以下方式将其存储在纯文本文件中: 光学变焦:15倍数码变焦:6倍电池类型:碱性分辨率百万像素:14 MP 我使用Selenium在Java中进行编程,因此无法为其找到正确的XPath表达式。 有人可以找出我为什么会犯错误的原因,并可能给我一些如何正确解析此数据的指示吗?我对Seleni

  • 问题内容: 这是我的代码: 我得到这个: 这意味着当我通过明确创建工厂时,Java正在使用类。 (实际上,我只需要在xpaths中放置一些…因此,如果知道不涉及Saxon的任何解决方案,请考虑达到了我的需要)。 我究竟做错了什么 ? 问题答案: 从撒克逊人的例子: 工作良好。

  • 问题内容: 我有这个HTML代码: 而且我必须选择带有text 的标签所标识的WebElement 。我尝试一些解决方案,例如: 但是每个人都给我: 正确的语法是什么?有人能帮我吗? 问题答案: 您没有正确的XPath语法。您需要在要匹配的文本属性值周围加上引号。尝试:

  • 问题内容: 我的XML文件如下所示: 我要做的就是提取ListPrice。 这是我正在使用的代码: 绝对没有输出。我也试过 没有不同。 我究竟做错了什么? 问题答案: 您有2个问题。 1)仅包含根元素,而不包含整个文档。它是Element类型而不是ElementTree类型。 2)如果将命名空间保留在XML中,则搜索字符串需要使用命名空间。 要解决问题1: 您需要更改: 至: 要解决问题2: 您可

  • 问题内容: 我知道Java没有指针,但是我听说可以用指针创建Java程序,而这可由少数Java专家来完成。是真的吗 问题答案: Java中的所有对象都是引用,你可以像使用指针一样使用它们。 取消引用null: 混叠问题: 丢失的细胞: 你可以通过首先确保不再需要第二个旧值或为另一个指针分配第二个值来确保此安全。 请注意,以其他方式给second赋值(NULL,new …)同样可能引起错误,并可能导