所以我正在尝试抓取一个包含多个页面的网站。每个页面都有多个 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