Извлечение тега 'td' путем поиска тега 'th' в той же строке 'tr' - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужен способ получить конкретный тег 'td' с его текстовым содержимым под определенным тегом 'th', принадлежащим к той же строке 'tr'.Вот как выглядит структура:

<tr>...Not interested in this row...</tr>
<tr>...Not interested in this row...</tr>
<tr>
    <th>Titletext</th>
    <td class="rightalign right">64663438434</td>
</tr>
<tr>...Not interested in this row...</tr>
<tr>...Not interested in this row...</tr>

Я хочу выполнить поиск по тегу 'th' и получить номер внутри тега 'td' под ним.Есть идеи?

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

BeautifulSoup достаточно любезен для поиска необходимых элементов:

value = soup.find('th', text='Titletext').findNextSibling('td').text

Вы получите строку, поэтому рассмотрите возможность преобразования ее в int ...


Еслистрока содержит более одного тега TD, и вы не хотите, чтобы первый, но первый с определенным классом, вы можете добавить это к запросу:

value = soup.find('th', text='Titletext').findNextSibling('td',
                  {'class': "rightalign right"}).text

(спасибо ArranDuff за это замечание)

0 голосов
/ 20 февраля 2019

Вы, вероятно, можете использовать модуль re.

import re
cells = re.findall(u"<th>Titletext</th>[^>]*>([^<]*)</td>", page)
print(cells)
0 голосов
/ 20 февраля 2019
  • Используя Beautiful soup, вы можете перебирать все tr's и искать th .
  • Затем для каждого th Вы можете использовать метод find_next_sibling , чтобы найти следующий элемент тега.
  • Если это обязательное значение td , извлеките число

Например,

import bs4

html = '<tr>...Not interested in this row...</tr> \n <tr>...Not interested in this row...</tr>\n <tr> \n <th>Titletext</th> \n <td class="rightalign right">64663438434</td> \n </tr> \n <tr>...Not interested in this row...</tr> \n <tr>...Not interested in this row...</tr>'
bs = bs4.BeautifulSoup(html)

for tr in bs.find_all('tr'):
    for th in tr.find_all('th'):
        td = th.find_next_sibling()
        if 'class=\"rightalign right' in str(td):
            print(td.text)

Вывод

64663438434

Лично я бы придерживался красивого супа, а не использовал бы как можно больше своих собственных регулярных выражений.Структура html может быть противоречивой, а красивый суп скрывает много сложности и поднятия тяжестей

0 голосов
/ 20 февраля 2019

Это то, что вы ищете?

num  = soup.find('td', class_='rightalign right')
num.text

вывод:

'64663438434'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...