problemas ... BeautifulSoup Parsing

<h2 class="sectionTitle">BACKGROUND</h2>
Mr. Paul J. Fribourg has bla bla</span>
<div style="margin-top:8px;">
    <a href="javascript:void(0)" onclick="show_more(this);">Read Full Background</a>
</div>

Me gustaría extraer información del Sr. Paul para blabla. Alguna página web tiene <p> enfrente del Sr. Paul, así que podría usar FindNext('p') Sin embargo, algunas páginas web no tienen <p> como el ejemplo anterior ..

este es mi código para cuando haya <p>

background = bs2.find(text=re.compile("BACKGROUND"))
bb= background.findNext('p').contents

Pero cuando no tengo <p> ¿Cómo podría extraer información?

preguntado el 27 de agosto de 11 a las 23:08

2 Respuestas

Es difícil saberlo por el ejemplo que nos ha dado, pero me parece que podría obtener el siguiente nodo después de un h2. En este ejemplo, Lewis Carroll tiene un p-Etiqueta de ragrafo y tu amigo Paul solo tiene un cierre span tag:

>>> from BeautifulSoup import BeautifulSoup
>>>
>>> html = '''
... <h2 class="sectionTitle">BACKGROUND</h2>
... <p>Mr. Lewis Carroll has bla bla</p>
... <div style="margin-top:8px;">
...     <a href="javascript:void(0)" onclick="show_more(this);">Read Full Background</a>
... </div>
... <h2 class="sectionTitle">BACKGROUND</h2>
... Mr. Paul J. Fribourg has bla bla</span>
... <div style="margin-top:8px;">
...     <a href="javascript:void(0)" onclick="show_more(this);">Read Full Background</a>
... </div>
... '''
>>>
>>> soup = BeautifulSoup(html)
>>> headings = soup.findAll('h2', text='BACKGROUND')
>>> for section in headings:
...     p = section.findNext('p')
...     if p:
...         print '> ',  p.string
...     else:
...         print '> ', section.parent.next.next.strip()
...
>  Mr. Lewis Carroll has bla bla
>  Mr. Paul J. Fribourg has bla bla

Siguientes comentarios:

>>> from BeautifulSoup import BeautifulSoup
>>> from urllib2 import urlopen
>>> html = urlopen('http://investing.businessweek.com/research/stocks/private/person.asp?personId=668561&privcapId=160900&previousCapId=285930&previousTitle=LOEWS%20CORP')
>>> soup = BeautifulSoup(html)
>>> headings = soup.findAll('h2', text='BACKGROUND')
>>> for section in headings:
...     paragraph = section.findNext('p')
...     if paragraph and paragraph.string:
...         print '> ', paragraph.string
...     else:
...         print '> ', section.parent.next.next.strip()
... 
>  Mr. Paul J. Fribourg has been the President of Contigroup Companies Inc. (for [...]

Por supuesto, es posible que desee consultar los avisos de derechos de autor, etcétera...

Respondido 30 ago 11, 13:08

¡Gracias por tu amable respuesta! En realidad, no hay ningún antes del Sr. Paul ... así que si ejecuto su código, se muestra Leer fondo completo ... ¿Le importaría dejarme saber la forma de resolver este problema? - Colita

@Willy: Mi respuesta original se basó en lo que aparentemente era una edición de su pregunta, donde alguien había agregado una etiqueta " ". He editado mi respuesta en consecuencia. - Johnsyweb

¡Oh, muchas gracias! está funcionando muy bien .. pero en mi sitio web original no funciona ..: ((me gustaría llorar .. - Colita

@Willy: ¿Puedes arreglar el HTML en el sitio web original para que sea válido? - Johnsyweb

en realidad, el sitio web original es este ... Estoy probando varias formas de extraer la información ... pero no sé por qué siempre fallo ... investing.businessweek.com/research/stocks/private/… - Colita

"Alguna página web tiene<p>frente al Sr. Paul, por lo que podría usar FindNext ('p'). Sin embargo, algunas páginas web no tienen<p>como el ejemplo anterior ".

No está dando suficiente información para poder reconocer su cadena:

  • estructura de nodo fija, por ejemplo, getChildren () [1] .getChildren () [0] .text
  • si está precedido por la cadena mágica 'BACKGROUND' según su código, entonces su enfoque para encontrar el siguiente nodo parece bueno, simplemente no cree en la suposición de que el nombre de la etiqueta es 'p'
  • regex (p. ej. "(Sr. | Sra.) ...")

Muéstranos un ejemplo HTML cuando no tenga <p> delante del nombre?

Respondido 30 ago 11, 01:08

¡Gracias por los amables comentarios! Creo que su segundo punto es correcto ... string El fondo podría ser la cadena mágica ... pero he estado considerando la forma de extraer un texto después de la palabra ... no sé ... no funciona ... - Colita

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.