Pregunta

En respuesta a un pregunta anterior , varias personas sugirieron que use BeautifulSoup para mi proyecto He estado luchando con su documentación y simplemente no puedo analizarla. ¿Alguien puede señalarme la sección donde debería poder traducir esta expresión a una expresión de 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 +') a td class altRow para obtener los enlaces desde allí.

También agradecería los consejos sobre cualquier otro tutorial o documentación. No pude encontrar ninguno.

Gracias por su ayuda.

Editar: Estoy mirando esta página :

>>> 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 observa el origen de la página, " / cabel " está allí:

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

Por alguna razón, los resultados de búsqueda no son 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 funciona. 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 enlaces con el segundo carácter " a " pero no los nombres de los abogados. Por alguna razón, esos enlaces (como '' / cabel '') no son visibles para BeautifulSoup. No entiendo por qué.

¿Fue útil?

Solución

Sé que BeautifulSoup es el módulo de análisis HTML canónico, pero a veces solo quieres eliminar algunas subcadenas de algún 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

Otros consejos

una opción es usar lxml (no estoy familiarizado con beautifulsoup, así que no puedo decir cómo hacerlo), por defecto admite XPath

Editar:
pruebe (sin probar) probado:

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

Utilicé documentos en http://www.crummy.com/software/BeautifulSoup /documentation.html

la sopa debería ser un objeto BeautifulSoup

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html_string)

Acabo de responder 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 totalmente Beautiful Soup 3.1 durante el análisis, pero Beautiful Soup 3.0 simplemente lo destruye.

El hilo se encuentra en el archivo de Grupos de Google .

Parece que está utilizando BeautifulSoup 3.1

Sugiero volver a BeautifulSoup 3.0.7 (debido a este problema )

Acabo de probar con 3.0.7 y obtuve los resultados que esperabas:

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

Las pruebas con BeautifulSoup 3.1 obtienen los resultados que está viendo. Probablemente hay una etiqueta con formato incorrecto en el html, pero no vi lo que era en un vistazo rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top