在BeautifulSoup中匹配部分ID

39 投票
4 回答
28397 浏览
提问于 2025-04-15 22:40

我正在使用BeautifulSoup这个工具。我需要找到所有带有类似于post-#的id的<div>标签。

比如说:

<div id="post-45">...</div>
<div id="post-334">...</div>

我试过:

html = '<div id="post-45">...</div> <div id="post-334">...</div>'
soupHandler = BeautifulSoup(html)
print soupHandler.findAll('div', id='post-*')

我该怎么筛选这些呢?

4 个回答

3

这个对我有效:

from bs4 import BeautifulSoup
import re

html = '<div id="post-45">...</div> <div id="post-334">...</div>'
soupHandler = BeautifulSoup(html)

for match in soupHandler.find_all('div', id=re.compile("post-")):
    print match.get('id')

>>> 
post-45
post-334
7

因为他想要匹配“post-#某个数字#”,所以最好用更具体的方式来处理。

import re
[...]
soupHandler.findAll('div', id=re.compile("^post-\d+"))
85

你可以把一个函数传递给findAll这个方法:

>>> print soupHandler.findAll('div', id=lambda x: x and x.startswith('post-'))
[<div id="post-45">...</div>, <div id="post-334">...</div>]

或者你也可以使用一个正则表达式:

>>> print soupHandler.findAll('div', id=re.compile('^post-'))
[<div id="post-45">...</div>, <div id="post-334">...</div>]

撰写回答