2009-11-29 13 views
9

In risposta a uno previous question, diverse persone hanno suggerito di utilizzare BeautifulSoup per il mio progetto. Ho lottato con la loro documentazione e non riesco proprio ad analizzarlo. Qualcuno può indicarmi la sezione in cui dovrei essere in grado di tradurre questa espressione in un'espressione di BeautifulSoup?Come posso tradurre questa espressione XPath in BeautifulSoup?

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

L'espressione sopra è da Scrapy. Sto cercando di applicare la regex re('\.a\w+') a td class altRow per ottenere i collegamenti da lì.

Apprezzerei anche i puntatori a qualsiasi altro tutorial o documentazione. Non sono riuscito a trovarne.

Grazie per il vostro aiuto.

Edit: sto guardando questo 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> 

Eppure, se si guarda alla sorgente della pagina "/cabel" c'è:

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

Per qualche ragione, i risultati della ricerca sono non visibile a BeautifulSoup, ma sono visibili a XPath perché hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') rileva "/ cabel"

Modifica: cobbal: non funziona ancora. Ma quando cerco questo:

>>>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>] 
>>> 

restituisce tutti i collegamenti con il secondo carattere "a" ma non i nomi dell'avvocato. Quindi per qualche ragione quei link (come "/ cabel") non sono visibili a BeautifulSoup. Non capisco perché.

+0

Hai provato le virgolette anziché le virgolette singole: '...'. – jfs

+0

per quanto posso dire, BeautifulSoup non sta analizzando correttamente la pagina, soup.contents non restituisce nulla dopo il tag ' 'che è verso l'inizio del documento. – cobbal

risposta

3

So che BeautifulSoup è il modulo di analisi HTML canonico, ma a volte si desidera solo estrarre alcune sottostringhe da alcuni HTML e il pyparsing ha alcuni metodi utili per farlo. Utilizzando questo codice:

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 

Ho estratto 914 riferimenti dalla pagina, da 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

Cercherò sicuramente di fare il pyparsing. Questo ha più senso per me di BeautifulSoup. – Zeynel

6

una possibilità è quella di utilizzare lxml (io non sono a conoscenza BeautifulSoup, quindi non posso dire come fare con esso), supporta defaultly XPath

Edit:
provare (non testata) testato:

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

ho usato documenti a http://www.crummy.com/software/BeautifulSoup/documentation.html

minestra deve essere un obiet BeautifulSoup t

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

Non vedo l'ora in questa installazione di Windows http://codespeak.net/lxml/installation.html se posso evitarlo. In caso contrario, sembra molto più bello di BeautifulSoup (documentazione saggio) – Zeynel

+0

dalla documentazione BS: Ecco alcuni modi per navigare la zuppa: soup.contents [0] .name # u'html' Quando provo, mi ottenere: soup.contents [0] .name Traceback (chiamata più recente scorso): file "", linea 1, in soup.contents [0] .name file "C: \ Python26 \ BeautifulSoup.py ", riga 427, in __getattr__ raise AttributeError," L'oggetto '% s' non ha attributo '% s' "% (self .__ class __.__ nam e__, attr) AttributeError: l'oggetto 'NavigableString' non ha attributo 'nome' – Zeynel

1

Sembra che si sta utilizzando BeautifulSoup 3.1

Suggerisco tornando al BeautifulSoup 3.0.7 (a causa della this problem)

Ho appena provato con 3.0.7 ed ho ottenuto i risultati che ci si aspetta :

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

Test con BeautifulSoup 3.1 ottiene i risultati che stai vedendo. C'è probabilmente un tag malformato nell'html ma non ho visto cosa fosse in un rapido sguardo.

2

Ho appena risposto alla mailing list di Beautiful Soup come risposta all'e-mail di Zeynel alla lista. Fondamentalmente, c'è un errore nella pagina web che uccide totalmente Beautiful Soup 3.1 durante l'analisi, ma è semplicemente stravolto da Beautiful Soup 3.0.

La filettatura si trova su Google Groups archive.

Problemi correlati