Detaillierte Erläuterung der grundlegenden Verwendung von xpath im Python-Crawler

不言
Freigeben: 2018-04-27 11:01:56
Original
4473 Leute haben es durchsucht

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
Nach dem Login kopieren

3 , verwenden Sie

1. Importieren Sie

from lxml import etree
Nach dem Login kopieren

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"))
Nach dem Login kopieren

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>
Nach dem Login kopieren

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(&#39;/html/body/p/ul/li/a&#39;)

print(html)

for i in html_data:

  print(i.text)

<Element html at 0x12fe4b8>

first item

second item

third item

fourth item

fifth item
Nach dem Login kopieren

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(&#39;/html/body/p/ul/li/a/text()&#39;)

print(html)

for i in html_data:

  print(i) 

<Element html at 0x138e4b8>

first item

second item

third item

fourth item

fifth item
Nach dem Login kopieren

4. Öffnen und lesen Sie die HTML-Datei

#使用parse打开html的文件

html = etree.parse(&#39;test.html&#39;)

html_data = html.xpath(&#39;//*&#39;)<br>#打印是一个列表,需要遍历

print(html_data)

for i in html_data:

  print(i.text)
Nach dem Login kopieren

html = etree.parse(&#39;test.html&#39;)

html_data = etree.tostring(html,pretty_print=True)

res = html_data.decode(&#39;utf-8&#39;)

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>
Nach dem Login kopieren

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(&#39;/html/body/p/ul/li/a/@href&#39;)

for i in html_data:

  print(i)
Nach dem Login kopieren

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(&#39;/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()&#39;)

print(html_data)

for i in html_data:

  print(i)
Nach dem Login kopieren

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(&#39;//li/a/text()&#39;)

print(html_data)

for i in html_data:

  print(i)
Nach dem Login kopieren

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(&#39;//li/a//@href&#39;)

print(html_data)

for i in html_data:

  print(i)
Nach dem Login kopieren

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(&#39;//li/a[@href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]&#39;)

print(html_data)

for i in html_data:

  print(i.text)
Nach dem Login kopieren

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(&#39;//li[last()]/a/text()&#39;)

print(html_data)

for i in html_data:

  print(i)
Nach dem Login kopieren

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(&#39;//li[last()-1]/a/text()&#39;)

print(html_data)

for i in html_data:

  print(i)
Nach dem Login kopieren

Drucken:

['viertes Element']

viertes Element

12. Wenn Sie eine Seite extrahieren Der XPath-Pfad eines bestimmten Tags kann wie folgt aussehen:

//*[@id="kw"]
Nach dem Login kopieren

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=&#39;i1&#39; href="link.html" rel="external nofollow" rel="external nofollow" >first item</a></li>
      <li class="item-0"><a id=&#39;i2&#39; 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=&#39;http://example.com&#39;, body=html,encoding=&#39;utf-8&#39;)
# hxs = HtmlXPathSelector(response)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[2]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[@id]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[@id="i1"]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[@href="link.html" rel="external nofollow" rel="external nofollow" ][@id="i1"]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[contains(@href, "link")]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[starts-with(@href, "link")]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[re:test(@id, "i\d+")]&#39;)
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[re:test(@id, "i\d+")]/text()&#39;).extract()
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//a[re:test(@id, "i\d+")]/@href&#39;).extract()
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;/html/body/ul/li/a/@href&#39;).extract()
# print(hxs)
# hxs = Selector(response=response).xpath(&#39;//body/ul/li/a/@href&#39;).extract_first()
# print(hxs)
 
# ul_list = Selector(response=response).xpath(&#39;//body/ul/li&#39;)
# for item in ul_list:
#   v = item.xpath(&#39;./a/span&#39;)
#   # 或
#   # v = item.xpath(&#39;a/span&#39;)
#   # 或
#   # v = item.xpath(&#39;*/a/span&#39;)
#   print(v)
Nach dem Login kopieren

Verwandte Empfehlungen:

Zusammenfassung von zwei Methoden für Python-Crawler, um echte Browser zum Öffnen von Webseiten zu verwenden


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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage