Quiero recoger una fecha en una página web.
El código fuente original de la página web se ve así:
<TR class=odd>
<TD>
<TABLE class=zp>
<TBODY>
<TR>
<TD><SPAN>Expiry Date</SPAN>2016</TD></TR></TBODY></TABLE></TD>
<TD> </TD>
<TD> </TD></TR>
Quiero retomar el '2016' pero fallo. Lo máximo que puedo hacer es:
page = urllib2.urlopen('http://www.thewebpage.com')
soup = BeautifulSoup(page.read())
a = soup.find_all(text=re.compile("Expiry Date"))
Y probé:
b = a[0].findNext('').text
print b
Y
b = a[0].find_next('td').select('td:nth-of-type(1)')
print b
Ninguna de ellas funciona.
¿Alguna ayuda? Gracias.
2 respuestas
Hay múltiples opciones
Opción # 1 (usando selector CSS, siendo muy explícito sobre la ruta al elemento):
from bs4 import BeautifulSoup
data = """
<TR class="odd">
<TD>
<TABLE class="zp">
<TBODY>
<TR>
<TD>
<SPAN>
Expiry Date
</SPAN>
2016
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD> </TD>
<TD> </TD>
</TR>
"""
soup = BeautifulSoup(data)
span = soup.select('tr.odd table.zp > tbody > tr > td > span')[0]
print span.next_sibling.strip() # prints 2016
Básicamente estamos diciendo: consígueme la etiqueta span
que está directamente dentro de td
que está directamente dentro de tr
que está directamente dentro de tbody
que está directamente dentro de {{ Etiqueta X4}} con clase zp
que está dentro de la etiqueta tr
con clase odd
. Entonces, estamos usando next_sibling
para obtener el texto después de la etiqueta span
.
Opción n. ° 2 (busque span
por texto; creo que es más legible)
span = soup.find('span', text=re.compile('Expiry Date'))
print span.next_sibling.strip() # prints 2016
Se necesita re.compile()
ya que podría haber varias líneas y espacios adicionales alrededor del texto. No te olvides del módulo import re
.
Una alternativa al selector css es:
import bs4
data = """
<TR class="odd">
<TD>
<TABLE class="zp">
<TBODY>
<TR>
<TD>
<SPAN>
Expiry Date
</SPAN>
2016
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD> </TD>
<TD> </TD>
</TR>
"""
soup = bs4.BeautifulSoup(data)
exp_date = soup.find('table', class_='zp').tbody.tr.td.span.next_sibling
print exp_date # 2016
Para conocer BeautifulSoup, le recomiendo que lea la documentación.
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.