Соответствие частичных идентификаторов в BeautifulSoup

Я использую BeautifulSoup. Я должен найти любую ссылку на теги <div> с таким идентификатором, как: post-#.

Например:

<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-*')

Как я могу отфильтровать это?

Ответ 1

Вы можете передать функцию 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>]

Ответ 2

Поскольку он просит сопоставить "post-# somenumber #", лучше уточнить с помощью

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

Ответ 3

soupHandler.findAll('div', id=re.compile("^post-$"))

смотрит прямо на меня.

Ответ 4

Это работает для меня:

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