通过在同一“ tr”行下搜索“ th”标签来检索“ td”标签

时间:2019-02-20 11:45:06

标签: python web-scraping beautifulsoup

我需要一种方法来检索特定的“ td”标签及其文本内容,该标签位于同一“ tr”行的特定“ th”标签下。结构是这样的:

<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 :(得分:0)

这是您要找的吗?

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

输出:

'64663438434'

答案 1 :(得分:0)

您可能可以使用re模块。

import re
cells = re.findall(u"<th>Titletext</th>[^>]*>([^<]*)</td>", page)
print(cells)

答案 2 :(得分:0)

  • 使用美丽的汤,您可以遍历所有 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的结构可能不一致,漂亮的汤掩盖了很多复杂性和繁重的负担

答案 3 :(得分:0)

BeautifulSoup足以为您搜索所需的元素:

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

您将获得一个字符串,因此请考虑将其转换为int ...


如果该行包含多个TD标签,并且您不希望第一个TD标签,但是想要第一个具有特定类的TD标签,则可以将其添加到请求中:

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

(感谢ArranDuff注意到)