Wie kann ich diesen XPath-Ausdruck in BeautifulSoup übersetzen?

Als Antwort auf eine vorhergehende Frage schlugen mehrere Leute vor, dass ich BeautifulSoup für mein Projekt verwende. Ich habe mit ihrer Dokumentation gekämpft und ich kann es einfach nicht analysieren. Kann jemand mich auf den Abschnitt zeigen, wo ich diesen Ausdruck in einen BeautifulSoup-Ausdruck übersetzen kann?

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

Der obige Ausdruck ist von Scrapy . Ich versuche, die Regex re('\.a\w+') auf td class altRow , um die Links von dort zu bekommen.

Ich würde auch Zeiger auf andere Tutorials oder Unterlagen schätzen. Ich konnte nichts finden.

Danke für Ihre Hilfe.

Bearbeiten: Ich freue mich auf diese Seite :

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

Dennoch, wenn man sich die Seitenquelle "/cabel" ist da:

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

Aus irgendeinem Grund sind die Suchergebnisse für BeautifulSoup nicht sichtbar, aber sie sind für XPath sichtbar, weil hxs.select('//td[@class="altRow"][2]/a/@href').re('/.a\w+') fängt "/ cabel"

Bearbeiten: cobbal: Es funktioniert noch nicht. Aber wenn ich das suche:

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

Es gibt alle Links mit dem zweiten Zeichen "a" zurück, aber nicht die Anwaltsnamen. Also aus irgendeinem Grund sind diese Links (wie "/ cabel") für BeautifulSoup nicht sichtbar. Ich verstehe nicht warum.

4 Solutions collect form web for “Wie kann ich diesen XPath-Ausdruck in BeautifulSoup übersetzen?”

Ich weiß, BeautifulSoup ist das kanonische HTML-Parsing-Modul, aber manchmal willst du nur einige Teilstrings aus irgendeinem HTML kratzen und pyparsing hat einige nützliche Methoden, dies zu tun. Mit diesem 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 

Ich habe 914 Referenzen von deiner Seite extrahiert, von Abel bis 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 

Eine Option ist, lxml zu verwenden (ich bin nicht vertraut mit beautifulsoup, also kann ich nicht sagen, wie man damit umgeht), es standardmäßig unterstützt XPath

Bearbeiten:
Versuchen (ungetestet) getestet:

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

Ich habe docs unter http://www.crummy.com/software/BeautifulSoup/documentation.html benutzt

Suppe sollte ein BeautifulSoup-Objekt sein

 import BeautifulSoup soup = BeautifulSoup.BeautifulSoup(html_string) 

Ich habe dies nur auf der Mailbox für schöne Soup als Antwort auf Zeynel's E-Mail an die Liste beantwortet. Grundsätzlich gibt es einen Fehler in der Web-Seite, die völlig tötet schöne Suppe 3.1 während der Parsing, sondern ist nur durch schöne Suppe 3.0 verstrickt.

Der Thread befindet sich im Google Groups-Archiv .

Es scheint, dass Sie mit BeautifulSoup 3.1 arbeiten

Ich schlage vor, auf BeautifulSoup 3.0.7 zurückzukehren (wegen dieses Problems )

Ich habe gerade mit 3.0.7 getestet und bekam die Ergebnisse, die Sie erwarten:

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

Testing with BeautifulSoup 3.1 bekommt die Ergebnisse, die du siehst. Es ist wahrscheinlich ein fehlerhaftes Tag in der html aber ich habe nicht gesehen, was es in einem schnellen Blick war.

  • Lxml xpath kann keine HTML-Elemente anzeigen
  • Wie man das XML-Attribut mit Python ElementTree extrahiert
  • Wie passe ich den Inhalt eines Elements in XPath (lxml) an?
  • Wie man eine Variable in xpath python
  • Wie bekomme ich den kompletten Inhalt eines Knotens mit xpath & lxml?
  • Erhalten Sie alle sichtbaren Text von einer Webseite mit Selen
  • Warum getparent () funktioniert nicht wie erwartet?
  • Parsing XPath in Nicht-Standard-XML mit lxml Python
  • Xpath wie Abfrage für verschachtelte Python-Wörterbücher
  • Lxml find <div> mit id = 'post- [0-9] *' [duplizieren]
  • Python lxml (objektivieren): Xpath Probleme
  • Python ist die beste Programmiersprache der Welt.