【问题标题】:How to Apply Regular Expression to BeautifulSoup with Python using find_All()如何使用 Python 使用 find_All() 将正则表达式应用于 BeautifulSoup
【发布时间】:2019-12-04 04:40:29
【问题描述】:

所以我试图抓取一个包含多个页面的网站。 每个页面有多个</table>标签,id从19到29,每个页面的表格数量是随机的

这是一个例子:

第 1 页 HTML

<table id='table20'>...</table>
<table id='table25'>...</table>

第 2 页 HTML

<table id='table19'>...</table>
<table id='table21'>...</table>
<table id='table29'>...</table>

第 3 页 HTML

<table id='table19'>...</table>
<table id='table20'>...</table>
<table id='table21'>...</table>

....

第 n 页 HTML

<table id='table19'>...</table>

我正在尝试将这些表格与 html 页面隔离开来,以便抓取它们。到目前为止,我能够遍历每一页,但我为从每一页中提取表格而编写的正则表达式似乎不起作用。请帮帮我。

这是我的代码:

tables = soup.find_all('table', id = re.compile('^table\d(19|2[0-9])'))

【问题讨论】:

    标签: python regex web-scraping beautifulsoup


    【解决方案1】:

    您可以使用正则表达式'table[12]\d' (regex101):

    data = '''<table id='table19'><tr></tr></table>
    <table id='table20'><tr></tr></table>
    <table id='table21'><tr></tr></table>
    
    <table id='table40'><tr></tr></table>'''
    
    from bs4 import BeautifulSoup
    import re
    
    soup = BeautifulSoup(data, 'html.parser')
    
    for table in soup.find_all('table', {'id':re.compile(r'table[12]\d')}):
        print(table)
    

    打印:

    <table id="table19"><tr></tr></table>
    <table id="table20"><tr></tr></table>
    <table id="table21"><tr></tr></table>
    

    编辑:对于表 19 或 20-29,使用非捕获组 (regex101):

    for table in soup.find_all('table', {'id':re.compile(r'table(?:19|2\d)')}):
        print(table)
    

    【讨论】:

    • 谢谢安德烈。 soup.find_all('table', {'id':re.compile(r'table(?:19|2\d)')}) 完全符合我的要求。宏伟的,出色的解决方案。非常感谢
    【解决方案2】:

    如果该 id 起始字符串对于感兴趣的表是唯一的,您是否可以不使用属性 = 值 css 选择器并以运算符开头?

    for table in soup.select('table[id^=table]'):
        #do something with table
    

    【讨论】:

    • QHarr,感谢您的贡献。安德烈的回答帮助了我。
    • 我没有尝试过,因为我认为它没有考虑到我只想选择 itds 介于 19 到 29 之间的表(table19、table20、.. .)。但是让我试试看,然后再回复你。
    • 好的。因为它读取的方式 每个页面都有多个 标签,其 id 范围从 19 到 29。 意味着只有 ids 19-29,因此不考虑其他数字。
    • 那么如果每个 id 都以 table 开头,并且这些 id 只出现在感兴趣的表中,那么上面应该可以工作并且效率更高,但只有一种方法可以找到。
    猜你喜欢
    • 2017-06-30
    • 2016-01-16
    • 2012-09-01
    • 2010-09-08
    • 2014-06-03
    • 2020-08-14
    • 2015-09-09
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多