本文同步發表於個人微信公衆號,掃一掃文章底部的二維碼或在微信搜索 極客導航 便可關注,每一個工做日都有文章更新。html
前兩篇咱們把網絡庫Requests大概的用法學了一遍,把網站上的每頁數據請求下來是爬蟲的第一步,接下來咱們就須要把每頁上對咱們有用數據進行提取。提取數據的方式有不少,好比說正則、xpath、bs4等,咱們今天就來學一下xpath的語法。python
數據格式 | 描述 | 做用 |
---|---|---|
XML | 可擴展標記語言 | 用來傳輸和存儲數據 |
HTML | 超文本標記語言 | 用來顯示數據 |
pip3 install lxml
複製代碼
XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和咱們在常規的電腦文件系統中看到的表達式很是類似。瀏覽器
表達式 | 含義 |
---|---|
/ | 從根節點開始 |
// | 從任意節點 |
. | 從當前節點 |
.. | 從當前節點的父節點 |
@ | 選取屬性 |
text() | 選取文本 |
案例微信
from lxml import etree
data = """ <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1" id="1" ><a href="link4.html">fourth item</a></li> <li class="item-0" data="2"><a href="link5.html">fifth item</a> </ul> </div> """
html = etree.HTML(data)#構造了一個XPath解析對象。etree.HTML模塊能夠自動修正HTML文本。
li_list = html.xpath('//ul/li')#選取ul下面的全部li節點
#li_list = html.xpath('//div/ul/li')#選取ul下面的全部li節點
a_list = html.xpath('//ul/li/a')#選取ul下面的全部a節點
herf_list = html.xpath('//ul/li/a/@href')#選取ul下面的全部a節點的屬性herf的值
text_list = html.xpath('//ul/li/a/text()')#選取ul下面的全部a節點的值
print(li_list)
print(a_list)
print(herf_list)
print(text_list)
#打印
[<Element li at 0x1015f4c48>, <Element li at 0x1015f4c08>, <Element li at 0x1015f4d08>, <Element li at 0x1015f4d48>, <Element li at 0x1015f4d88>]
[<Element a at 0x1015f4dc8>, <Element a at 0x1015f4e08>, <Element a at 0x1015f4e48>, <Element a at 0x1015f4e88>, <Element a at 0x1015f4ec8>]
['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
['first item', 'second item', 'third item', 'fourth item', 'fifth item']
複製代碼
咱們發現最後打印的值都是一個列表對象,若是想取值就能夠遍歷列表了。網絡
選取未知節點 XPath 通配符可用來選取未知的 XML 元素。函數
通配符 | 含義 |
---|---|
* | 選取任何元素節點 |
@* | 選取任何屬性的節點 |
案例學習
from lxml import etree
data = """ <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1" id="1" ><a href="link4.html">fourth item</a></li> <li class="item-0" data="2"><a href="link5.html">fifth item</a> </ul> </div> """
html = etree.HTML(data)
li_list = html.xpath('//li[@class="item-0"]')#選取class爲item-0的li標籤
text_list = html.xpath('//li[@class="item-0"]/a/text()')#選取class爲item-0的li標籤 下面a標籤的值
li1_list = html.xpath('//li[@id="1"]')#選取id屬性爲1的li標籤
li2_list = html.xpath('//li[@data="2"]')#選取data屬性爲2的li標籤
print(li_list)
print(text_list)
print(li1_list)
print(li2_list)
#打印
[<Element li at 0x101dd4cc8>, <Element li at 0x101dd4c88>]
['first item', 'fifth item']
[<Element li at 0x101dd4d88>]
[<Element li at 0x101dd4c88>]
複製代碼
謂語的一些路徑表達式網站
表達式 | 含義 |
---|---|
[?] | 選取第幾個節點 |
last() | 選取最後一個節點 |
last()-1 | 選取倒數第二個節點 |
position()-1 | 選取前兩個 |
案例spa
from lxml import etree
data = """ <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1" id="1" ><a href="link4.html">fourth item</a></li> <li class="item-0" data="2"><a href="link5.html">fifth item</a> </ul> </div> """
html = etree.HTML(data)
li_list = html.xpath('//ul/li[1]') # 選取ul下面的第一個li節點
li1_list = html.xpath('//ul/li[last()]') # 選取ul下面的最後一個li節點
li2_list = html.xpath('//ul/li[last()-1]') # 選取ul下面的最後一個li節點
li3_list = html.xpath('//ul/li[position()<= 3]') # 選取ul下面前3個標籤
text_list = html.xpath('//ul/li[position()<= 3]/a/@href') # 選取ul下面前3個標籤的裏面的a標籤裏面的href的值
print(li_list)
print(li1_list)
print(li2_list)
print(li3_list)
print(text_list)
#打印
[<Element li at 0x1015d3cc8>]
[<Element li at 0x1015d3c88>]
[<Element li at 0x1015d3d88>]
[<Element li at 0x1015d3cc8>, <Element li at 0x1015d3dc8>, <Element li at 0x1015d3e08>]
['link1.html', 'link2.html', 'link3.html']
複製代碼
表達式 | 含義 |
---|---|
starts-with | 選取以什麼開頭的元素 |
contains | 選取包含一些信息的元素 |
and | 而且的關係 |
or | 或者的關係 |
案例插件
from lxml import etree
data = """ <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li> <li class="item-inactive"><a href="link3.html">third item</a></li> <li class="item-1" id="1" ><a href="link4.html">fourth item</a></li> <li class="item-0" data="2"><a href="link5.html">fifth item</a> </ul> </div> """
html = etree.HTML(data)
li_list = html.xpath('//li[starts-with(@class,"item-1")]')#獲取class包含以item-1開頭的li標籤
li1_list = html.xpath('//li[contains(@class,"item-1")]')#獲取class包含item的li標籤
li2_list = html.xpath('//li[contains(@class,"item-0") and contains(@data,"2")]')#獲取class爲item-0而且data爲2的li標籤
li3_list = html.xpath('//li[contains(@class,"item-1") or contains(@data,"2")]')#獲取class爲item-1或者data爲2的li標籤
print(li_list)
print(li1_list)
print(li2_list)
print(li3_list)
#打印
[<Element li at 0x101dcac08>, <Element li at 0x101dcabc8>]
[<Element li at 0x101dcac08>, <Element li at 0x101dcabc8>]
[<Element li at 0x101dcacc8>]
[<Element li at 0x101dcac08>, <Element li at 0x101dcabc8>, <Element li at 0x101dcacc8>]
複製代碼
以上是Xpath一些經常使用用法,若是想了解更多的語法能夠參考W3School
咱們能夠在瀏覽器安裝一些xpath插件,方便咱們進行解析數據。
去瀏覽器擴展下載這些插件,會在瀏覽器左上角看到圖標,以下
大概使用方法:咱們把網絡庫、解析庫,接下來咱們就能夠開始真正的爬蟲之旅,後續的文章打算用Requests和Xpath爬取幾個網站。
歡迎關注個人公衆號,咱們一塊兒學習。