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>&nbsp;</TD>
<TD>&nbsp;</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.

1
Mark K 2 sep. 2014 a las 07:35

2 respuestas

La mejor respuesta

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>&nbsp;</TD>
    <TD>&nbsp;</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.

1
alecxe 2 sep. 2014 a las 03:49

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>&nbsp;</TD>
    <TD>&nbsp;</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.

0
Yep_It's_Me 2 sep. 2014 a las 03:57