使用XPath获取兄弟元素和父元素的文本

时间:2017-10-23 23:39:35

标签: java xpath

我有以下部分HTML,我想从中获取最后一个< br> - 表示此示例中的link元素和TEXT5。

<td>
  <span>
    <span>TEXT1</span>
  </span>
  <br>
  TEXT2
  <span>TEXT3</span>
  <br>
  <a href=...>TEXT4</a>
  TEXT5
<td>

使用

获取link元素相对容易
td/br[last()]/following-sibling::*

但是有没有办法获得TEXT5?

编辑:我应该补充说我正在使用Java。这与问题无关,但可能与解决方案有关: - )

2 个答案:

答案 0 :(得分:1)

正如您所观察到的,*只返回元素,而您需要在此处返回元素节点和文本节点。您可以使用node()代替,它将返回任何类型的节点:

td/br[last()]/following-sibling::node()

如果您愿意,也可以更具体,例如,您可以添加谓词以将节点类型限制为a元素或文本节点:

td/br[last()]/following-sibling::node()[self::a|self::text()]

尽管XPath表达式本身有效,但是有可能你的Java API不支持返回混合类型的节点,我不知道。

答案 1 :(得分:0)

您可以捕获&#34; td&#34;中的所有文本,这将为您提供&#34; TEXT1TEXT2TEXT3TEXT4TEXT5&#34;,然后gsub它以删除从第一个字符到TEXT4结尾的所有内容。 当然,您需要知道什么是TEXT4的字符串。

对于isntance,

library(tidvyverse)
library(rvest)

Text4 <- read_html('your.html') %>% html_node(xpath = "//td/br/a") %>% html_text()

OnlyText5 <- read_html('your.html') %>% html_node(xpath = "//td") %>% html_text() %>% gsub(paste0('.*',Text4) ,'', . )