【问题标题】:Retrieving a 'td' tag by searching for a 'th' tag under the same 'tr' row通过在同一“tr”行下搜索“th”标签来检索“td”标签
【发布时间】:2019-02-20 11:45:06
【问题描述】:

我需要一种方法来检索特定的“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' 标签内的数字。有什么想法吗?

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    这就是你要找的吗?

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

    输出:

    '64663438434'
    

    【讨论】:

      【解决方案2】:

      你也许可以使用 re 模块。

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

      【讨论】:

      • 忘了说所有的'td'标签都有相同的'rightalign right'描述,所以这有点需要通过正确的'th'标签找到,不是吗?
      • 请不要建议使用re 模块来解析XML 或HTML。两者都喜欢递归标签,re 讨厌它们。
      【解决方案3】:

      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 注意到它)

      【讨论】:

      • 这将找到 Titletext 的下一个 td 兄弟,但不一定直接是下一个兄弟。它也不一定是正确的类。即
      • @ArranDuff:你可能是对的。我已经编辑了我的帖子。感谢您的评论。
      【解决方案4】:
      • 使用 Beautiful soup 您可以遍历所有 tr's 并搜索 th's
      • 然后对于每个 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的结构可以不一致,漂亮的汤隐藏了很多复杂性和繁重的工作

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签