如何使用 find_All() 将正则表达式应用于 Python 的 BeautifulSoup



所以我正在尝试抓取一个包含多个页面的网站。每个页面都有多个 ID 范围为 19 到 29 的 </table> 标记。每页上的表数是随机的

下面是一个示例:

第 1 页 网页

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

第 2 页 网页

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

第 3 页 网页

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

....

页面 n 网页

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

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

这是我的代码:

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

您可以使用正则表达式'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|2d)')}):
    print(table)

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

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

最新更新