scrap - jsoup python
Usando BeautifulSoup para encontrar una etiqueta HTML que contenga cierto texto (3)
Estoy intentando obtener los elementos en un documento HTML que contiene el siguiente patrón de texto: # / S {11}
<h2> this is cool #12345678901 </h2>
Entonces, lo anterior coincidiría usando:
soup(''h2'',text=re.compile(r'' #/S{11}''))
Y los resultados serían algo así como:
[u''blahblah #223409823523'', u''thisisinteresting #293845023984'']
Puedo obtener todo el texto que coincida (vea la línea de arriba). Pero quiero que el elemento padre del texto coincida, por lo que puedo usarlo como punto de partida para atravesar el árbol de documentos. En este caso, me gustaría que todos los elementos h2 regresen, no que el texto coincida.
Ideas?
Con bs4 (Beautiful Soup 4), el intento del OP funciona exactamente como se esperaba:
from bs4 import BeautifulSoup
soup = BeautifulSoup("<h2> this is cool #12345678901 </h2>")
soup(''h2'',text=re.compile(r'' #/S{11}''))
devuelve [<h2> this is cool #12345678901 </h2>]
.
Las operaciones de búsqueda de BeautifulSoup entregan [una lista de] objetos BeautifulSoup.NavigableString
cuando text=
se usa como criterio en lugar de BeautifulSoup.Tag
en otros casos. Verifique el __dict__
del objeto para ver los atributos disponibles para usted. De estos atributos, el parent
es el favorito sobre el previous
debido a cambios en BS4 .
from BeautifulSoup import BeautifulSoup
from pprint import pprint
import re
html_text = """
<h2>this is cool #12345678901</h2>
<h2>this is nothing</h2>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>
"""
soup = BeautifulSoup(html_text)
# Even though the OP was not looking for ''cool'', it''s more understandable to work with item zero.
pattern = re.compile(r''cool'')
pprint(soup.find(text=pattern).__dict__)
#>> {''next'': u''/n'',
#>> ''nextSibling'': None,
#>> ''parent'': <h2>this is cool #12345678901</h2>,
#>> ''previous'': <h2>this is cool #12345678901</h2>,
#>> ''previousSibling'': None}
print soup.find(''h2'')
#>> <h2>this is cool #12345678901</h2>
print soup.find(''h2'', text=pattern)
#>> this is cool #12345678901
print soup.find(''h2'', text=pattern).parent
#>> <h2>this is cool #12345678901</h2>
print soup.find(''h2'', text=pattern) == soup.find(''h2'')
#>> False
print soup.find(''h2'', text=pattern) == soup.find(''h2'').text
#>> True
print soup.find(''h2'', text=pattern).parent == soup.find(''h2'')
#>> True
from BeautifulSoup import BeautifulSoup
import re
html_text = """
<h2>this is cool #12345678901</h2>
<h2>this is nothing</h2>
<h1>foo #126666678901</h1>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>
"""
soup = BeautifulSoup(html_text)
for elem in soup(text=re.compile(r'' #/S{11}'')):
print elem.parent
Huellas dactilares:
<h2>this is cool #12345678901</h2>
<h2>this is interesting #126666678901</h2>
<h2>this is blah #124445678901</h2>