是否有可能在某些文本字符串后刮掉一系列节点?

时间:2017-10-23 11:25:24

标签: r xpath rvest

简短的问题:我想从一系列网页中抓取一系列html_nodes。当这些元素位于没有任何类或id的列表中时,就会出现问题。我不能使用XPATH,因为根据以前的信息,所需元素的位置因页面而异。

详细信息:

html代码(片段)如下所示:

<div class='heading'>Available at</div>
<ul class='list-unstyled'>
<li>
<img alt="The%20beach%20lab%20%28mobile%29" class="avatar tiny" src="...>
<a href="/labs/thebeachlab">The Beach Lab x Middle East</a>
</li>
<li>
<img alt="Default lab avatar" class="avatar tiny" src="...>
<a href="/labs/fabedcarolina">Fab Ed Carolina</a>
</li>
...

</ul>

由于没有嵌套类和ids,我唯一的选择就是使用Xpath:

fablabs = url %>%
    html_nodes(xpath = '/html/body/div[2]/div[2]/div[2]/ul[3]/li/a') %>%
    html_text()

不幸的是,虽然这适用于此页面,但在其他页面中无法使用,因为此列表的位置会因页面之间的内容而异,具体取决于之前的内容。

我唯一知道的是我想要刮掉字符串Available at下面的东西。有没有办法在R中实现这个目标?

1 个答案:

答案 0 :(得分:4)

您可以尝试使用XPath following-sibling轴,例如:

//div[.="Available at"]/following-sibling::ul/li/a

简要说明:

  • //div[.="Available at"] :找到内部文字等于'可用于'的div元素

  • /following-sibling::ul :然后查找ul

  • 的所有div元素
  • li/a :然后从这些ul元素返回孙子a,其中父级为li