python - tutorial - BeautifulSoup excluye el contenido dentro de una determinada etiqueta(s)
scraping beautifulsoup python (2)
Encuentre y únase a todos los nodos de texto en la etiqueta p
y compruebe que su padre no es a
etiqueta a:
p = soup.find("td", {"id": "overview-top"}).find("p", {"itemprop": "description"})
print ''''.join(text for text in p.find_all(text=True)
if text.parent.name != "a")
Demostración (no ver el link text
impreso):
>>> from bs4 import BeautifulSoup
>>>
>>> data = """
... <td id="overview-top">
... <p itemprop="description">
... text1
... <a href="google.com">link text</a>
... text2
... </p>
... </td>
... """
>>> soup = BeautifulSoup(data)
>>> p = soup.find("td", {"id": "overview-top"}).find("p", {"itemprop": "description"})
>>> print p.text
text1
link text
text2
>>>
>>> print ''''.join(text for text in p.find_all(text=True) if text.parent.name != "a")
text1
text2
Tengo el siguiente elemento para encontrar el texto en un párrafo:
soup.find("td", { "id" : "overview-top" }).find("p", { "itemprop" : "description" }).text
¿Cómo excluiría todo el texto dentro de una etiqueta <a>
? Algo como in <p> but not in <a>
?
Usando lxml,
import lxml.html as LH
data = """
<td id="overview-top">
<p itemprop="description">
text1
<a href="google.com">link text</a>
text2
</p>
</td>
"""
root = LH.fromstring(data)
print(''''.join(root.xpath(
''//td[@id="overview-top"]//p[@itemprop="description"]/text()'')))
rendimientos
text1
text2
Para obtener también el texto de etiquetas secundarias de <p>
, solo use una doble barra diagonal hacia adelante, //text()
, en lugar de una sola barra diagonal:
print(''''.join(root.xpath(
''//td[@id="overview-top"]//p[@itemprop="description"]//text()'')))
rendimientos
text1
link text
text2