欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲之xpath的基本使用詳解

 更新時間:2018年04月18日 10:52:14   作者:Charles.L  
本篇文章主要介紹了python爬蟲之xpath的基本使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、簡介

XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上。 

二、安裝

pip3 install lxml 

三、使用

1、導(dǎo)入

from lxml import etree 

2、基本使用

from lxml import etree
wb_data = """
    <div>
      <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>
     </div>

    """
html = etree.HTML(wb_data)
print(html)
result = etree.tostring(html)
print(result.decode("utf-8")) 

從下面的結(jié)果來看,我們打印機html其實就是一個python對象,etree.tostring(html)則是不全里html的基本寫法,補全了缺胳膊少腿的標(biāo)簽。

 <Element html at 0x39e58f0>
<html><body><div>
      <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>
     </div>
    </body></html> 

3、獲取某個標(biāo)簽的內(nèi)容(基本使用),注意,獲取a標(biāo)簽的所有內(nèi)容,a后面就不用再加正斜杠,否則報錯。

寫法一

html = etree.HTML(wb_data)

html_data = html.xpath('/html/body/div/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 

寫法二(直接在需要查找內(nèi)容的標(biāo)簽后面加一個/text()就行)

html = etree.HTML(wb_data)

html_data = html.xpath('/html/body/div/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、打開讀取html文件

#使用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)

 

打?。?

<div>

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

</div> 

5、打印指定路徑下a標(biāo)簽的屬性(可以通過遍歷拿到某個屬性的值,查找標(biāo)簽的內(nèi)容)

html = etree.HTML(wb_data)

html_data = html.xpath('/html/body/div/ul/li/a/@href')

for i in html_data:

  print(i)

打?。?/p>

link1.html

link2.html

link3.html

link4.html

link5.html

6、我們知道我們使用xpath拿到得都是一個個的ElementTree對象,所以如果需要查找內(nèi)容的話,還需要遍歷拿到數(shù)據(jù)的列表。

查到絕對路徑下a標(biāo)簽屬性等于link2.html的內(nèi)容。

html = etree.HTML(wb_data)

html_data = html.xpath('/html/body/div/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)

打?。?/p>

['second item']

second item

7、上面我們找到全部都是絕對路徑(每一個都是從根開始查找),下面我們查找相對路徑,例如,查找所有l(wèi)i標(biāo)簽下的a標(biāo)簽內(nèi)容。

html = etree.HTML(wb_data)

html_data = html.xpath('//li/a/text()')

print(html_data)

for i in html_data:

  print(i)

打?。?/p>

['first item', 'second item', 'third item', 'fourth item', 'fifth item']

first item

second item

third item

fourth item

fifth item

8、上面我們使用絕對路徑,查找了所有a標(biāo)簽的屬性等于href屬性值,利用的是/---絕對路徑,下面我們使用相對路徑,查找一下l相對路徑下li標(biāo)簽下的a標(biāo)簽下的href屬性的值,注意,a標(biāo)簽后面需要雙//。

html = etree.HTML(wb_data)

html_data = html.xpath('//li/a//@href')

print(html_data)

for i in html_data:

  print(i)

打印:

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']

link1.html

link2.html

link3.html

link4.html

link5.html

9、相對路徑下跟絕對路徑下查特定屬性的方法類似,也可以說相同。

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)

打?。?/p>

[<Element a at 0x216e468>]

second item

10、查找最后一個li標(biāo)簽里的a標(biāo)簽的href屬性

html = etree.HTML(wb_data)

html_data = html.xpath('//li[last()]/a/text()')

print(html_data)

for i in html_data:

  print(i)

打?。?/p>

['fifth item']

fifth item

11、查找倒數(shù)第二個li標(biāo)簽里的a標(biāo)簽的href屬性 

html = etree.HTML(wb_data)

html_data = html.xpath('//li[last()-1]/a/text()')

print(html_data)

for i in html_data:

  print(i)

打?。?/p>

['fourth item']

fourth item

12、如果在提取某個頁面的某個標(biāo)簽的xpath路徑的話,可以如下圖:

//*[@id="kw"] 

解釋:使用相對路徑查找所有的標(biāo)簽,屬性id等于kw的標(biāo)簽。

常用

#!/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>
    <div><a href="llink2.html" rel="external nofollow" rel="external nofollow" >second item</a></div>
  </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)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 教你用一行Python代碼實現(xiàn)并行任務(wù)(附代碼)

    教你用一行Python代碼實現(xiàn)并行任務(wù)(附代碼)

    這篇文章主要介紹了教你用一行Python代碼實現(xiàn)并行任務(wù)(附代碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Python圖像運算之腐蝕與膨脹詳解

    Python圖像運算之腐蝕與膨脹詳解

    這篇文章將詳細(xì)講解開始圖像形態(tài)學(xué)知識,主要介紹圖像腐蝕處理和膨脹處理。文中的示例代碼簡潔易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2022-05-05
  • numpy下的flatten()函數(shù)用法詳解

    numpy下的flatten()函數(shù)用法詳解

    這篇文章主要介紹了numpy下的flatten()函數(shù)用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python調(diào)用支付寶支付接口流程

    python調(diào)用支付寶支付接口流程

    這篇文章主要介紹了python調(diào)用支付寶支付接口流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 如何利用Playwright庫進行電影網(wǎng)站數(shù)據(jù)的獲取

    如何利用Playwright庫進行電影網(wǎng)站數(shù)據(jù)的獲取

    playwright庫是微軟開源的一個庫,這個庫的功能更加的強大,除了可以實現(xiàn)同步操作,同樣也可以實現(xiàn)異步的操作,這篇文章主要介紹了如何利用Playwright庫進行電影網(wǎng)站數(shù)據(jù)的獲取,需要的朋友可以參考下
    2023-05-05
  • 僅用50行Python代碼實現(xiàn)一個簡單的代理服務(wù)器

    僅用50行Python代碼實現(xiàn)一個簡單的代理服務(wù)器

    這篇文章主要介紹了僅用50行Python代碼實現(xiàn)一個簡單的代理服務(wù)器,利用最簡單的client->proxy->forward原理在socket模塊下編寫,需要的朋友可以參考下
    2015-04-04
  • 詳解Python 裝飾器執(zhí)行順序迷思

    詳解Python 裝飾器執(zhí)行順序迷思

    這篇文章主要介紹了詳解Python 裝飾器執(zhí)行順序迷思,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 利用Python實現(xiàn)顏色色值轉(zhuǎn)換的小工具

    利用Python實現(xiàn)顏色色值轉(zhuǎn)換的小工具

    最近一個朋友說已經(jīng)轉(zhuǎn)用Zeplin很久了。Zeplin的設(shè)計稿展示頁面的顏色色值使用十進制的 RGB 表示的,在 Android 中的顏色表示大多情況下都需要十六進制的 RGB 表示。所以想寫個工作,當(dāng)輸入十進制的RGB ,得到十六進制的色值,最好可以方便復(fù)制。下面來一起看看吧。
    2016-10-10
  • python 爬蟲之selenium可視化爬蟲的實現(xiàn)

    python 爬蟲之selenium可視化爬蟲的實現(xiàn)

    這篇文章主要介紹了python 爬蟲之selenium可視化爬蟲的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • keras的ImageDataGenerator和flow()的用法說明

    keras的ImageDataGenerator和flow()的用法說明

    這篇文章主要介紹了keras的ImageDataGenerator和flow()的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論