Как получить элемент HTML с учетом более позднего содержимого другого тега, а не класса? - PullRequest
0 голосов
/ 16 июня 2020

Я преобразовываю HTML в красивый и аккуратный CSV. У меня есть файл с таблицами и несколькими классами. У меня есть три типа таблиц, и их структура одинакова. Единственная разница заключается в содержании элемента «th», который идет после элемента, который меня интересует. Как я могу получить только содержимое таблиц, в которых есть определенный текст в «th» («text_that_I_want_to_get»)? Есть ли способ вставить класс с R внутри каждого типа таблицы?

Тип 1 таблицы

 <tr>
    <th class="array">text_that_I_want_to_get</th>
    <td class="array">
        <table>
            <thead>
                <tr>
                    <th class="string">name</th>
                    <th class="string">mean</th>
                    <th class="string">stdev</th>
                </tr>
            </thead>
            <tbody>

Тип 2 таблицы

<tr>
    <th class="array">text_that_I_want_to_get</th>
    <td class="array">
        <table>
            <thead>
                <tr>
                    <th class="string">name</th>
                    <th class="array">answers</th>
                </tr>
            </thead>
            <tbody>

Тип 3 стола

<tr>
    <th class="array">text_that_I_want_to_get</th>
    <td class="array">
        <table>
            <thead>
                <tr>
                    <th class="string">Reference</th>
                </tr>
            </thead>
            <tbody>

1 Ответ

1 голос
/ 16 июня 2020

Вам нужны следующие три xpath:

xpath1 <- "//td[table[./thead/tr/th/text() = 'stdev']]/preceding-sibling::th"
xpath2 <- "//td[table[./thead/tr/th/text() = 'answers']]/preceding-sibling::th"
xpath3 <- "//td[table[./thead/tr/th/text() = 'Reference']]/preceding-sibling::th"

Они находят узел td, который находится в root каждого из трех типов таблиц, а затем находят предшествующего th брата с помощью текст, который вы хотите.

Итак, чтобы получить "text_that_I_want_to_get" для типа таблицы 1, вы выполните:

read_html(url) %>% html_nodes(xpath = xpath1) %>% html_text()
#> [1] "text_that_I_want_to_get"

И вы можете сделать то же самое с xpath2 и xpath3, чтобы получить текст из таблицы типа 2 и таблицы типа 3.

...