tag scrap how ejemplo python regex beautifulsoup html-content-extraction

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>