R, XPath, очистка текста : получение текста внутри узла при фильтрации по значению атрибута одного из его потомков.

#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"