#r #web-scraping #xpath
Вопрос:
Вот краткий макет кода. То, что я хочу получить,-это вектор символов с текстовым содержимым каждого p-узла, для которого потомок a имеет свой атрибут href = «value1».
<doc>
<div class="intervention">
<p>
<a></a>
<b>
<a href="value1">xxx</a>
</b>
text1
</p>
<p>
<a></a>
<b>
<a href="value2">xxx</a>
</b>
text2
</p>
<p>
<a></a>
<b>
<a href="value1">xxx</a>
</b>
text3
</p>
</div>
<div class="intervention">
<p>
<a></a>
<b>
<a href="value2">xxx</a>
</b>
text4
</p>
<p>
<a></a>
<b>
<a href="value1">xxx</a>
</b>
text5
</p>
<p>
<a></a>
<b>
<a href="value1">xxx</a>
</b>
text6
</p>
</div>
</doc>
Другими словами, я хочу получить этот вектор:
c("xxxtext1","xxxtext3","xxxtext5","xxxtext6")
Не могли бы вы, пожалуйста, помочь мне найти подходящий XPath? До сих пор я нашел этот, который дает мне все текстовое содержимое в узле p, но я не могу заставить его фильтровать на основе значения href a.
"//div[@class='intervention']//*[not(self::script)]"
Заранее большое спасибо за вашу помощь!
Ответ №1:
Ваш xpath должен быть //a[@href='value1']/ancestor::p
Так, например:
library(xml2)
result <- xml_text(xml_find_all(doc, xpath = "//a[@href='value1']/ancestor::p"))
gsub("\s", "", result) # Remove line breaks and spaces
#> [1] "xxxtext1" "xxxtext3" "xxxtext5" "xxxtext6"