python find - Können wir Xpath mit BeautifulSoup verwenden?




html lxml (6)

Ich kann bestätigen, dass es in Beautiful Soup keine XPath-Unterstützung gibt.

Ich benutze BeautifulSoup, um eine URL zu scrappen und ich hatte den folgenden Code

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
req = urllib2.Request(url)
response = urllib2.urlopen(req)
the_page = response.read()
soup = BeautifulSoup(the_page)
soup.findAll('td',attrs={'class':'empformbody'})

Im obigen Code können wir findAll , um Tags und Informationen zu erhalten, aber ich möchte xpath verwenden. Ist es möglich, Xpath mit BeautifulSoup zu verwenden? Wenn möglich, kann mir bitte jemand einen Beispielcode geben, damit es hilfreicher ist?


Martijns Code funktioniert nicht mehr richtig (er ist 4+ Jahre alt ...), die etree.parse() druckt auf die Konsole und weist den Wert nicht der etree.parse() zu. Darauf Bezug this , konnte ich herausfinden, dass dies mit Anfragen und lxml funktioniert:

from lxml import html
import requests

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)
#This will create a list of buyers:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#This will create a list of prices
prices = tree.xpath('//span[@class="item-price"]/text()')

print 'Buyers: ', buyers
print 'Prices: ', prices

Nein, BeautifulSoup unterstützt keine XPath-Ausdrücke.

Eine alternative Bibliothek, lxml , unterstützt XPath 1.0. Es hat einen BeautifulSoup-kompatiblen Modus, in dem zerbrochenes HTML-Material wie Soup analysiert wird. Der standardmäßige lxml-HTML-Parser ist jedoch genauso gut für die Analyse von fehlerhaftem HTML-Code geeignet, und ich glaube, er ist schneller.

Nachdem Sie Ihr Dokument in eine .xpath() geparst haben, können Sie mit der .xpath() -Methode nach Elementen suchen.

import urllib2
from lxml import etree

url =  "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urllib2.urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)

Möglicherweise interessiert Sie die CSS Selector-Unterstützung . Die CSSSelector Klasse übersetzt CSS-Anweisungen in XPath-Ausdrücke, was Ihre Suche nach td.empformbody viel einfacher macht:

from lxml.cssselect import CSSSelector

td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
    # Do something with these table cells.

Der Kreis schließt sich: BeautifulSoup selbst hat ziemlich gute CSS-Selector-Unterstützung :

for cell in soup.select('table#foobar td.empformbody'):
    # Do something with these table cells.

Ich habe ihre Dokumente durchsucht und es scheint, dass es keine XPath-Option gibt. Wie Sie here auf einer ähnlichen Frage zu SO sehen können, fragt das OP nach einer Übersetzung von Xpath nach BeautifulSoup. Meine Schlussfolgerung wäre also: Nein, es gibt kein Xpath-Parsing.


Dies ist ein ziemlich alter Thread, aber es gibt jetzt eine Lösung, die zu dieser Zeit noch nicht in BeautifulSoup war.

Hier ist ein Beispiel von dem, was ich getan habe. Ich benutze das Modul "Anfragen", um einen RSS-Feed zu lesen und seinen Textinhalt in einer Variablen namens "rss_text" abzurufen. Damit führe ich es durch BeautifulSoup, suche nach dem xpath / rss / channel / title und lade seinen Inhalt ab. Es ist nicht genau XPath in seiner ganzen Pracht (Wildcards, mehrere Pfade, etc.), aber wenn Sie nur einen grundlegenden Pfad haben, den Sie finden möchten, funktioniert das.

from bs4 import BeautifulSoup
rss_obj = BeautifulSoup(rss_text, 'xml')
cls.title = rss_obj.rss.channel.title.get_text()

Rufen Sie die Funktion create_dir()am Einstiegspunkt Ihres Programms / Projekts auf.

import os

def create_dir(directory):
    if not os.path.exists(directory):
        print('Creating Directory '+directory)
        os.makedirs(directory)

create_dir('Project directory')




python xpath beautifulsoup urllib