【问题标题】:Beautiful Soup filter function fails to find all rows of a tableBeautiful Soup 过滤功能无法找到表的所有行
【发布时间】:2015-05-19 07:48:35
【问题描述】:

我正在尝试使用 Python Beautiful Soup 4 库解析一个大型 html 文档。

该页面包含一个非常大的表格,结构如下:

<table summary='foo'>
    <tbody>
        <tr> 
            A bunch of data 
        </tr>
        <tr>
            More data 
        </tr>
        .
        .
        .
        100s of <tr> tags later
    </tbody>
</table>

我有一个函数可以评估soup.descendants 中的给定标签是否属于我正在寻找的那种。这是必要的,因为页面很大(BeautifulSoup 告诉我文档包含大约 4000 个标签)。 是这样的:

def isrow(tag):
    if tag.name == u'tr':
        if tag.parent.parent.name == u'table' and \
                tag.parent.parent.has_attr('summary'): 
            return True

我的问题是,当我遍历 soup.descendants 时,该函数仅返回表中前 77 行的 True,而我知道 &lt;tr&gt; 标记继续存在数百行。

这是我的函数的问题,还是我不了解 BeautifulSoup 如何生成其后代集合?我怀疑这可能是 Python 或 bs4 内存问题,但我不知道如何进行故障排除。

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    这更像是一个有根据的猜测,但我会试一试。

    BeautifulSoup 解析 HTML 的方式很大程度上取决于 underlying parser。如果您没有specify it explicitlyBeautifulSoup 将根据内部排名自动选择一个:

    如果您不指定任何内容,您将获得最好的 HTML 解析器 安装。 Beautiful Soup 将 lxml 的解析器评为最佳,然后 html5lib 的,然后是 Python 的内置解析器。

    在你的情况下,我会尝试切换解析器,看看你会得到什么结果:

    soup = BeautifulSoup(data, "lxml")  # needs lxml to be installed
    soup = BeautifulSoup(data, "html5lib")  # needs html5lib to be installed
    soup = BeautifulSoup(data, "html.parser")  # uses built-in html.parser
    

    【讨论】:

    • 谢谢,您的猜测很有根据。切换到 python 的内置解析器 html.parser 后,我能够返回表的所有 304 行,而不是使用 lxml 解析时得到的 77 行。
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 2013-07-15
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多