2010-05-13 20 views
16

Estoy usando BeautifulSoup - módulo python. Tengo que encontrar cualquier referencia a los div's con id como: 'post- #'. Por ejemplo:Identificación coincidente en BeautifulSoup

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

Cómo puedo filtrar esto?

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

¿Qué versión de BeautifulSoup está usando? –

Respuesta

40

Puede pasar una función a findAll:

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

O una expresión regular:

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

AttributeError: el objeto 'NoneType' no tiene ningún atributo 'startswith' – Ockonal

+2

He corregido el 'AttributeError'. – jfs

+1

+1 para la función lambda –

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

se ve bien para mí.

+4

¿Por qué pones el '$'? No creo que eso funcione como lo pretende el OP. –

3

Desde que está pidiendo para que coincida con "post # someNumber #", que es mejor preciso con

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

Esto funciona para mí:

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