Question

En réponse à une question précédente , plusieurs personnes m'ont suggéré d'utiliser BeautifulSoup . pour mon projet. J'ai eu du mal avec leur documentation et je ne peux tout simplement pas l'analyser. Quelqu'un peut-il m'indiquer la section où je devrais être capable de traduire cette expression en expression BeautifulSoup?

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

L'expression ci-dessus provient de Scrapy . J'essaie d'appliquer l'expression régulière re ('\. A \ w +') à td class altRow pour obtenir les liens à partir de là.

J'apprécierais également les pointeurs vers d'autres tutoriels ou documentations. Je n'en ai trouvé aucun.

Merci de votre aide.

Modifier: Je regarde cette 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> 

Pourtant, si vous regardez la source de la page, "/ cabel" est présent:

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

Pour une raison quelconque, les résultats de la recherche ne sont pas visibles par BeautifulSoup, mais par XPath car hxs.select ('// td [@ class = "altRow"] [2] / a / @ href ') .re (' /. a \ w + ') attrape "/ cabel"

Modifier: Cobbal: Il ne fonctionne toujours pas. Mais quand je cherche ceci:

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

il renvoie tous les liens avec le second caractère "& a;" " mais pas les noms d'avocat. Donc, pour une raison quelconque, ces liens (tels que "/ cabel") ne sont pas visibles par BeautifulSoup. Je ne comprends pas pourquoi.

Était-ce utile?

La solution

Je sais que BeautifulSoup est le module canonique d’analyse HTML, mais vous voulez parfois extraire quelques sous-chaînes de HTML, et pyparsing a quelques méthodes utiles pour le faire. En utilisant ce code:

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

J'ai extrait 914 références de votre page, d'abel à 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

Autres conseils

Une option consiste à utiliser lxml (je ne suis pas familier avec beautifulsoup, je ne peux donc pas dire comment m'en servir), il prend en charge par défaut XPath

Modifier:
essayez (non testé) testé:

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

J'ai utilisé des documents sur http://www.crummy.com/software/BeautifulSoup /documentation.html

soup doit être un objet BeautifulSoup

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html_string)

Je viens juste de répondre à cette question sur la liste de diffusion Beautiful Soup en réponse au courrier électronique envoyé par Zeynel à la liste. Fondamentalement, il y a une erreur dans la page Web qui tue totalement Beautiful Soup 3.1 lors de l'analyse syntaxique, mais est simplement endommagée par Beautiful Soup 3.0.

Le fil de discussion se trouve à la Archive des groupes Google .

Il semble que vous utilisiez BeautifulSoup 3.1

Je suggère de revenir à BeautifulSoup 3.0.7 (à cause de ce problème )

Je viens de tester avec 3.0.7 et j'ai obtenu les résultats escomptés:

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

Les tests avec BeautifulSoup 3.1 génèrent les résultats escomptés. Il y a probablement une balise malformée dans le code HTML, mais je n'ai pas vu ce que c'était en un coup d'œil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top