2009-11-29 17 views
9

En respuesta a un previous question, varias personas sugirieron que use BeautifulSoup para mi proyecto. He estado luchando con su documentación y simplemente no puedo analizarlo. ¿Puede alguien señalarme la sección en la que debería ser capaz de traducir esta expresión a una expresión BeautifulSoup?¿Cómo puedo traducir esta expresión XPath a BeautifulSoup?

hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') 

La expresión anterior es de Scrapy. Estoy tratando de aplicar la expresión regular re('\.a\w+') al td class altRow para obtener los enlaces desde allí.

También me gustaría obtener consejos sobre otros tutoriales o documentación. No pude encontrar ninguno.

Gracias por su ayuda.

Editar: Me gustaría encontrar en este page:

>>> soup.head.title 
<title>White & Case LLP - Lawyers</title> 
>>> soup.find(href=re.compile("/cabel")) 
>>> soup.find(href=re.compile("/diversity")) 
<a href="/diversity/committee">Committee</a> 

Sin embargo, si nos fijamos en la fuente de la página "/cabel" está ahí:

<td class="altRow" valign="middle" width="34%"> 
<a href='/cabel'>Abel, Christian</a> 

Por alguna razón, los resultados de búsqueda son no visibles para BeautifulSoup, pero son visibles para XPath porque hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') captura "/ cabel"

Editar: cobbal: Todavía no está funcionando. Pero cuando busco esto:

>>>soup.findAll(href=re.compile(r'/.a\w+')) 
[<link href="/FCWSite/Include/styles/main.css" rel="stylesheet" type="text/css" />, <link rel="shortcut icon" type="image/ico" href="/FCWSite/Include/main_favicon.ico" />, <a href="/careers/northamerica">North America</a>, <a href="/careers/middleeastafrica">Middle East Africa</a>, <a href="/careers/europe">Europe</a>, <a href="/careers/latinamerica">Latin America</a>, <a href="/careers/asia">Asia</a>, <a href="/diversity/manager">Diversity Director</a>] 
>>> 

devuelve todos los vínculos con la segunda letra "A", pero no los nombres de abogado. Por alguna razón, esos enlaces (como "/ cabel") no son visibles para BeautifulSoup. No entiendo por qué.

+0

Ha intentado con comillas dobles en lugar de comillas simples: '...'. – jfs

+0

por lo que puedo decir, BeautifulSoup no está analizando la página correctamente, soup.contents no da nada después de la etiqueta ' 'que está hacia el comienzo del documento. – cobbal

Respuesta

3

Sé que BeautifulSoup es el módulo de análisis de HTML canónico, pero a veces solo quieres eliminar algunas subcadenas de algunos HTML, y pyparsing tiene algunos métodos útiles para hacerlo. Usando este código:

from pyparsing import makeHTMLTags, withAttribute, SkipTo 
import urllib 

# get the HTML from your URL 
url = "http://www.whitecase.com/Attorneys/List.aspx?LastName=&FirstName=" 
page = urllib.urlopen(url) 
html = page.read() 
page.close() 

# define opening and closing tag expressions for <td> and <a> tags 
# (makeHTMLTags also comprehends tag variations, including attributes, 
# upper/lower case, etc.) 
tdStart,tdEnd = makeHTMLTags("td") 
aStart,aEnd = makeHTMLTags("a") 

# only interested in tdStarts if they have "class=altRow" attribute 
tdStart.setParseAction(withAttribute(("class","altRow"))) 

# compose total matching pattern (add trailing tdStart to filter out 
# extraneous <td> matches) 
patt = tdStart + aStart("a") + SkipTo(aEnd)("text") + aEnd + tdEnd + tdStart 

# scan input HTML source for matching refs, and print out the text and 
# href values 
for ref,s,e in patt.scanString(html): 
    print ref.text, ref.a.href 

Extraje 914 referencias de su página, de Abel a Zupikova.

Abel, Christian /cabel 
Acevedo, Linda Jeannine /jacevedo 
Acuña, Jennifer /jacuna 
Adeyemi, Ike /igbadegesin 
Adler, Avraham /aadler 
... 
Zhu, Jie /jzhu 
Zídek, Aleš /azidek 
Ziółek, Agnieszka /aziolek 
Zitter, Adam /azitter 
Zupikova, Jana /jzupikova 
+0

Definitivamente intentaré pyparsing. Esto tiene más sentido para mí que BeautifulSoup. – Zeynel

6

una opción es utilizar lxml (no estoy familiarizado con BeautifulSoup, así que no puedo decir cómo hacer con él), es compatible con defaultly XPath

Editar:
tratar (no probado) probados:

soup.findAll('td', 'altRow')[1].findAll('a', href=re.compile(r'/.a\w+'), recursive=False) 

I utilizarse docs en http://www.crummy.com/software/BeautifulSoup/documentation.html

sopa debe ser un objec BeautifulSoup t

import BeautifulSoup 
soup = BeautifulSoup.BeautifulSoup(html_string) 
+0

No espero con ansias esta instalación de Windows http://codespeak.net/lxml/installation.html si puedo evitarla. De lo contrario se verá mejor que BeautifulSoup (documentación en cuanto a) – Zeynel

+0

de la documentación BS: Aquí están algunas maneras de navegar por la sopa: soup.contents [0] .name # u'html' Cuando lo intento, Get: soup.contents [0] .name Rastreo (llamada más reciente pasado): archivo "", línea 1, en soup.contents [0] .name archivo "C: \ Python26 \ BeautifulSoup.py ", línea 427, en __getattr__ raise AttributeError," '% s' object no tiene ningún atributo '% s' "% (self .__ class __.__ nam e__, attr) AttributeError: el objeto 'NavigableString' no tiene ningún atributo 'name' – Zeynel

1

Parece que está utilizando BeautifulSoup 3.1

Sugiero volver a BeautifulSoup 3.0.7 (a causa de this problem)

acabo probado con 3.0.7 y consiguió los resultados esperados :

>>> soup.findAll(href=re.compile(r'/cabel')) 
[<a href="/cabel">Abel, Christian</a>] 

Prueba con BeautifulSoup 3.1 obtiene los resultados que está viendo. Probablemente haya una etiqueta mal formada en el html pero no vi lo que era en un vistazo rápido.

2

Acabo de responder a esto en la lista de correo de Beautiful Soup como respuesta al correo electrónico de Zeynel a la lista. Básicamente, hay un error en la página web que mata por completo a Beautiful Soup 3.1 durante el análisis, pero simplemente está destrozado por Beautiful Soup 3.0.

El hilo se encuentra en el Google Groups archive.

Cuestiones relacionadas