【问题标题】:Scraping an HTML Table with BeautifulSoup doesn't return all tags使用 BeautifulSoup 抓取 HTML 表格不会返回所有标签
【发布时间】:2017-10-06 19:14:28
【问题描述】:

出于某种原因,我的代码将返回值标签(例如,“截止日期”、“记录”、“需要工作”等),但它不返回值。例如,当我运行代码时,它会返回“到期日期”而不是“2014-Nov-27”。

更奇怪的是,如果我调整代码以接受 url 的原始输入,代码会返回所有内容(即标签和值)。

请记住,我正在尝试遍历具有相同 HTML 格式的 url 列表。

HTML

table id="mcs-initial-abstract-grid" >
        <tr class="mci-grid-row-header">
            <th >
                <table style="width:100%">
                    <tr>
                        <td>SOME STRING</td>
                        <td>SOME INTEGER   </td>
                        <td>SOME STRING</td>
                    </tr>
                </table>
            </th>
        </tr>

        <tr>
            <td>
                <table style="width:100%">
                    <tr class="mci-gridview-alternate">
                        <td style="width:25%"><strong>Due Date:</strong></td>
                        <td style="width:20%">2014-Nov-27</td>
                        <td style="width:20%"><strong>Recorded:</strong></td>
                        <td style="width:35%">2015-Nov-7</td>
                    </tr>
                    <tr >
                        <td><strong>Work Required:</strong></td>
                        <td>$20</td>
                        <td><strong>Variable:</strong></td>
                        <td>2015-Nov-25 14:20</td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>

我的代码:

from bs4  import BeautifulSoup as bs
import requests
import urllib

url = 'enter url here'
r = requests.get(url)
html_content = r.text
soup = bs(html_content, 'html5lib')
for tags in soup.find_all('table', id='mcs-initial-abstract-grid'):
    for tbody in tags.find_all('tbody'):
        for tr in tbody.find_all('tr', {'class':'mci-gridview-alternate'} ):
            for td in tr.find_all('td'):
                print td.text

【问题讨论】:

  • 也许html5lib 慷慨地提供了缺失的标签;但是,我注意到问题列出的 HTML 中缺少 tbody

标签: python web-scraping beautifulsoup html-table


【解决方案1】:

最有可能的罪魁祸首是tbody。这是usually generated by browsers 的“特殊”标签之一。而且,由于您使用requests 获取页面源 - 不涉及真正的浏览器,因此您不会在html_content 中获得tbody

而且,如果从 HTML 解析逻辑中删除 tbody 没有帮助,请尝试使用 other parsers - html.parserlxml 而不是 html5lib

【讨论】:

  • 我删除了 tbody 标签并收到了非常相似的结果。我也试过'lxml'和'html.parser',但没有运气。此外,当我将代码转换为提示输入 url 的 raw_input 时,将返回数据。这很棒,但我需要遍历一个 url 列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2016-05-12
  • 2021-01-11
相关资源
最近更新 更多