Dieser Artikel stellt hauptsächlich die grundlegende Verwendung von xpath im Python-Crawler vor. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz. Werfen wir gemeinsam einen Blick darauf
1. Einführung
XPath ist eine Sprache zum Auffinden von Informationen in XML-Dokumenten. XPath kann zum Durchlaufen von Elementen und Attributen in XML-Dokumenten verwendet werden. XPath ist ein Hauptelement des W3C XSLT-Standards und sowohl XQuery als auch XPointer basieren auf XPath-Ausdrücken.
2. Installation
pip3 install lxml
3 , verwenden Sie
1. Importieren Sie
from lxml import etree
2. Grundlegende Verwendung
from lxml import etree wb_data = """ <p> <ul> <li class="item-0"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li> <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li> <li class="item-inactive"><a href="link3.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >third item</a></li> <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li> <li class="item-0"><a href="link5.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fifth item</a> </ul> </p> """ html = etree.HTML(wb_data) print(html) result = etree.tostring(html) print(result.decode("utf-8"))
Aus den folgenden Ergebnissen geht hervor, dass unser Drucker-HTML tatsächlich ein Python-Objekt ist und etree.tostring(html) die grundlegende Schreibmethode für unvollständiges HTML ist, die die fehlenden Tags vervollständigt.
<Element html at 0x39e58f0> <html><body><p> <ul> <li class="item-0"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li> <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li> <li class="item-inactive"><a href="link3.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >third item</a></li> <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li> <li class="item-0"><a href="link5.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fifth item</a> </li></ul> </p> </body></html>
3. Um den gesamten Inhalt eines Tags abzurufen, müssen Sie Folgendes beachten: Es ist nicht erforderlich, einen Schrägstrich dahinter einzufügen, da sonst ein Fehler gemeldet wird.
Schreibmethode eins
html = etree.HTML(wb_data) html_data = html.xpath('/html/body/p/ul/li/a') print(html) for i in html_data: print(i.text) <Element html at 0x12fe4b8> first item second item third item fourth item fifth item
Schreibmethode zwei (fügen Sie einfach ein /text() direkt nach dem Tag hinzu, wo Sie es benötigen den Inhalt finden)
html = etree.HTML(wb_data) html_data = html.xpath('/html/body/p/ul/li/a/text()') print(html) for i in html_data: print(i) <Element html at 0x138e4b8> first item second item third item fourth item fifth item
4. Öffnen und lesen Sie die HTML-Datei
#使用parse打开html的文件 html = etree.parse('test.html') html_data = html.xpath('//*')<br>#打印是一个列表,需要遍历 print(html_data) for i in html_data: print(i.text)
html = etree.parse('test.html') html_data = etree.tostring(html,pretty_print=True) res = html_data.decode('utf-8') print(res) 打印: <p> <ul> <li class="item-0"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li> <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li> <li class="item-inactive"><a href="link3.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >third item</a></li> <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li> <li class="item-0"><a href="link5.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fifth item</a></li> </ul> </p>
5. Drucken Sie die Attribute eines Tags unter dem angegebenen Pfad (Sie können den Wert eines Attributs durch Durchlaufen erhalten und den Inhalt des Tags finden)
html = etree.HTML(wb_data) html_data = html.xpath('/html/body/p/ul/li/a/@href') for i in html_data: print(i)
Drucken:
link1.html
link2.html
link3.html
link4.html
link5.html
6 Wir wissen, dass wir xpath verwenden, um jedes ElementTree-Objekt abzurufen. Wenn wir also den Inhalt finden müssen, Wir müssen durchlaufen, um die Daten zu erhalten.
Suchen Sie den Inhalt, bei dem das Tag-Attribut a unter dem absoluten Pfad link2.html entspricht.
html = etree.HTML(wb_data) html_data = html.xpath('/html/body/p/ul/li/a[@href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]/text()') print(html_data) for i in html_data: print(i)
Drucken:
['zweiter Artikel']
zweiter Artikel
7. Oben finden wir alle absoluten Pfade (jeder wird von der Wurzel aus durchsucht), unten finden wir relative Pfade, zum Beispiel den a-Tag-Inhalt unter allen li-Tags.
html = etree.HTML(wb_data) html_data = html.xpath('//li/a/text()') print(html_data) for i in html_data: print(i)
Drucken:
['erster Artikel', 'zweiter Artikel', 'dritter Artikel', 'vierter Artikel' , 'fünfter Punkt']
erster Punkt
zweiter Punkt
dritter Punkt
vierter Punkt
fünfter Punkt
8. Oben haben wir den absoluten Pfad verwendet, um alle Attribute des a-Tags zu finden, die dem href-Attributwert entsprechen. Als nächstes verwenden wir den relativen Pfad, um den li zu finden Tag unter dem relativen Pfad l. Der Wert des href-Attributs unter dem a-Tag. Beachten Sie, dass nach dem a-Tag ein Double // erforderlich ist.
html = etree.HTML(wb_data) html_data = html.xpath('//li/a//@href') print(html_data) for i in html_data: print(i)
Drucken:
['link1.html', 'link2.html', 'link3.html', ' link4.html', 'link5.html']
link1.html
link2.html
link3.html
link4.html
link5.html
9 Die Methoden zur Überprüfung spezifischer Attribute unter relativen Pfaden ähneln denen unter absoluten Pfaden, oder man kann sagen, dass sie gleich sind.
html = etree.HTML(wb_data) html_data = html.xpath('//li/a[@href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]') print(html_data) for i in html_data: print(i.text)
Drucken:
[
] zweites Element
10. Finden Sie das href-Attribut des a-Tags im letzten li-Tag
html = etree.HTML(wb_data) html_data = html.xpath('//li[last()]/a/text()') print(html_data) for i in html_data: print(i)
Drucken:
['fünftes Element']
fünftes Element
11. Suchen Sie das href-Attribut des a-Tags im vorletzten li-Tag
html = etree.HTML(wb_data) html_data = html.xpath('//li[last()-1]/a/text()') print(html_data) for i in html_data: print(i)
Drucken:
['viertes Element']
viertes Element
12. Wenn Sie eine Seite extrahieren Der XPath-Pfad eines bestimmten Tags kann wie folgt aussehen:
//*[@id="kw"]
Erläuterung: Verwenden Sie relative Pfade, um alle Tags mit der Attribut-ID gleich kw zu finden.
Häufig verwendet
#!/usr/bin/env python # -*- coding:utf-8 -*- from scrapy.selector import Selector, HtmlXPathSelector from scrapy.http import HtmlResponse html = """<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <ul> <li class="item-"><a id='i1' href="link.html" rel="external nofollow" rel="external nofollow" >first item</a></li> <li class="item-0"><a id='i2' href="llink.html" rel="external nofollow" >first item</a></li> <li class="item-1"><a href="llink2.html" rel="external nofollow" rel="external nofollow" >second item<span>vv</span></a></li> </ul> <p><a href="llink2.html" rel="external nofollow" rel="external nofollow" >second item</a></p> </body> </html> """ response = HtmlResponse(url='http://example.com', body=html,encoding='utf-8') # hxs = HtmlXPathSelector(response) # print(hxs) # hxs = Selector(response=response).xpath('//a') # print(hxs) # hxs = Selector(response=response).xpath('//a[2]') # print(hxs) # hxs = Selector(response=response).xpath('//a[@id]') # print(hxs) # hxs = Selector(response=response).xpath('//a[@id="i1"]') # print(hxs) # hxs = Selector(response=response).xpath('//a[@href="link.html" rel="external nofollow" rel="external nofollow" ][@id="i1"]') # print(hxs) # hxs = Selector(response=response).xpath('//a[contains(@href, "link")]') # print(hxs) # hxs = Selector(response=response).xpath('//a[starts-with(@href, "link")]') # print(hxs) # hxs = Selector(response=response).xpath('//a[re:test(@id, "i\d+")]') # print(hxs) # hxs = Selector(response=response).xpath('//a[re:test(@id, "i\d+")]/text()').extract() # print(hxs) # hxs = Selector(response=response).xpath('//a[re:test(@id, "i\d+")]/@href').extract() # print(hxs) # hxs = Selector(response=response).xpath('/html/body/ul/li/a/@href').extract() # print(hxs) # hxs = Selector(response=response).xpath('//body/ul/li/a/@href').extract_first() # print(hxs) # ul_list = Selector(response=response).xpath('//body/ul/li') # for item in ul_list: # v = item.xpath('./a/span') # # 或 # # v = item.xpath('a/span') # # 或 # # v = item.xpath('*/a/span') # print(v)
Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der grundlegenden Verwendung von xpath im Python-Crawler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!