【问题标题】:Scraping table with BeautifulSoup4用 BeautifulSoup4 刮桌
【发布时间】:2018-08-24 07:32:16
【问题描述】:

我正在尝试抓取表格中的一些详细信息行,但我不知道如何正确访问这些信息。这是html:

<tr class="even">
  <td style="background: #F5645C; color: #F5645C;">1&#160;</td>
  <td>Michael</td>
  <td class="right">57</td>
  <td class="right">0</td>
  <td class="right">5</td>
</tr>
<tr class="odd">
  <td style="background: #8FB9B0; color: #8FB9B0;">1&#160;</td>
  <td>Clara</td>
  <td class="right">48</td>
  <td class="right">0</td>
  <td class="right">5</td>
</tr>
<tr class="even">
  <td style="background: #F5645C; color: #F5645C;">1&#160;</td>
  <td>Lisa</td>
  <td class="right">44</td>
  <td class="right">2</td>
  <td class="right">5</td>
</tr>
<tr class="odd">
  <td style="background: #8FB9B0; color: #8FB9B0;">0&#160;</td>
  <td>Joe</td>
  <td class="right">43</td>
  <td class="right">0</td>
  <td class="right">13</td>
</tr>
<tr class="even">
  <td style="background: #F5645C; color: #F5645C;">1&#160;</td>
  <td>John</td>
  <td class="right">38</td>
  <td class="right">3</td>
  <td class="right">4</td>
</tr>
<tr class="odd">
  <td style="background: #F5645C; color: #F5645C;">1&#160;</td>
  <td>Francesca</td>
  <td class="right">35</td>
  <td class="right">2</td>
  <td class="right">5</td>
</tr>
<tr class="even">
  <td style="background: #8FB9B0; color: #8FB9B0;">0&#160;</td>
  <td>Carlos</td>
  <td class="right">27</td>
  <td class="right">1</td>
  <td class="right">2</td>
</tr>

我试图获得的是在每个 td 之后出现的下一个 td 上的文本,颜色为 F5645C,但不幸的是我遇到了问题。 这就是我希望脚本返回的内容: 迈克尔 丽莎 约翰 弗朗西斯卡

这是我目前拥有的代码:

table = soup.find('table')
table_rows = table.find_all('tr')

for tr in table_rows:
    td = tr.find('td', style='background: #F5645C; color: #F5645C;').find_next_sibling('td').get_text()
    print(td)

在运行脚本时:AttributeError: 'NoneType' object has no attribute 'find_next_sibling'

【问题讨论】:

  • 您尝试点击的td 可能不存在,因此没有下一个兄弟姐妹。样式是一个糟糕的选择器,你能不能不用class或者id?
  • 我不能,我复制粘贴了我拥有的确切 html...

标签: python beautifulsoup


【解决方案1】:

您可以使用 CSS 选择器选择所有包含 style 属性和字符串 color: #F5645C&lt;td&gt; 标签,然后应用方法 find_next()

for td in soup.select('td[style*="color: #F5645C"]'):
  print(td.find_next('td').text)

打印出来:

Michael
Lisa
John
Francesca

【讨论】:

    【解决方案2】:
    data = BeautifulSoup(html)
    for tr in data.find_all('tr'):
        td = tr.find_all('td')
        print(td[1].text)
    

    我想现在你可以更进一步了..

    【讨论】:

    • 列表索引超出范围
    【解决方案3】:

    使用.findNext("td").text

    例如:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find_all("tr"):
        print(tr.td.findNext("td").text)
    

    输出:

    Michael
    Clara
    Lisa
    Joe
    John
    Francesca
    Carlos
    

    【讨论】:

    • AttributeError: 'NoneType' 对象没有属性 'findNext'
    【解决方案4】:

    使用可以使用find_allstyle 属性的过滤器:

     bs = BeautifulSoup(htmlcontent)
     bs.find_all('td', attrs={'style':'background-color: #F5645C, color: #F5645C'})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多