相信寫過爬蟲的同學植袍,都知道XPath的存在片部。博主最近在學習Scrapy的時候,就了解了一下XPath語法生蚁,這里給大家簡單地介紹一下:
首先我們需要了解幾個 XPath 術語。
2017/3/3 16:02:29
節(jié)點(node)
在 XPath 中戏自,有七種類型的節(jié)點:元素邦投、屬性、文本擅笔、命名空間志衣、處理指令、注釋以及文檔(根)節(jié)點剂娄。XML 文檔是被作為節(jié)點樹來對待的蠢涝。樹的根被稱為文檔節(jié)點或者根節(jié)點。
以下面這xml文檔為例:
<?xml version="1.0" encoding="ISO-8859-1"?>
<class>
<student>
<name gender="boy">Harry Potter</name>
<ID>24</ID>
</student>
<student>
<name gender="girl">Li Rose<font color=red>(monitor)</font></title>
<ID>1</ID>
</student>
</class>
上面例子的節(jié)點為:
<classs> (文檔節(jié)點/根節(jié)點)
<ID>24</ID> (元素節(jié)點)
gender="boy" (屬性節(jié)點)
節(jié)點關系
父:每個元素以及屬性都有一個父阅懦。例子中<student>的父是<class>;
子:元素節(jié)點可有零個和二、一個或多個子。例子中<class>的子是<student>;
兄弟:擁有相同的父的節(jié)點耳胎。例子中<name>和<ID>是兄弟;
祖先:某節(jié)點的父惯吕、父的父,等等怕午。
后代:某節(jié)點的子废登、子的子,等等郁惜。
基本值(或稱原子值堡距,Atomic value)
基本值是無父或無子的節(jié)點。
上面例子的基本值為:
Harry Potter
"boy"
項目(Item)
項目是基本值或者節(jié)點兆蕉。
ok羽戒,接下來開始正式講解 XPath 語法(注意,以下表達式當然可以混合使用):
1 nodename
選取此節(jié)點的所有子節(jié)點虎韵。
from scrapy import Selector
def parse(self, response):
selector=Selector(response)
content=selector.xpath(class)# 選取 class 元素的所有子節(jié)點易稠。
2 /
從根節(jié)點選取。
from scrapy import Selector
def parse(self, response):
selector=Selector(response)
'''
選取根元素 class包蓝。
注釋:假如路徑起始于正斜杠( / )驶社,則此路徑始終代表到某元素的絕對路徑企量!
'''
content1=selector.xpath(/class)
content2=selector.xpath(/class/student)
3 //
從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置亡电。
from scrapy import Selector
def parse(self, response):
selector=Selector(response)
content=selector.xpath(//ID)# 選取所有ID子元素届巩,而不管它們在文檔中的位置。
4 .
選取當前節(jié)點份乒。
5 ..
選取當前節(jié)點的父節(jié)點姆泻。
6 @
選取屬性。
from scrapy import Selector
def parse(self, response):
selector=Selector(response)
# 選取所有gender="boy"屬性的節(jié)點冒嫡,而不管它們在文檔中的位置拇勃。
content=selector.xpath(//[@gender="boy"])
7 謂語(Predicates)
/class/student[1]
選取屬于 class 子元素的第一個 student 元素。
/class/student[last()]
選取屬于 class 子元素的最后一個 student 元素孝凌。
/class/student[last()-1]
選取屬于 class 子元素的倒數(shù)第二個 student 元素方咆。
/class/student[position()<3]
選取屬于 class 子元素的前兩個 student 元素。
/class/student[@gender]
選取所有擁有名為 gender 的屬性的 student 元素蟀架。
/class/student[@gender="boy"]
選取所有擁有 gender="boy" 屬性的 student 元素瓣赂。
/class/student[ID<50]
選取 class 元素的所有 student 元素,且其中的 ID 元素的值須小于 50片拍。
/class/student[ID<50]/name
選取 class 元素中的 student 元素的所有 name 元素煌集,且其中的 ID 元素的值須小于 35。
8 通配符
1. * 匹配任何元素節(jié)點
2. @* 匹配任何屬性節(jié)點
3. node() 匹配任何類型的節(jié)點
9 拓展
對于如下的xml文檔(參照http://www.tuicool.com/articles/iqQFBn)
<div id="test2">美女捌省,<font color=red>你的微信是多少苫纤?</font><div>
如果使用:
data = selector.xpath('//div[@id="test2"]/text()').extract()[0]
只能提取到“美女,”纲缓;
如果使用:
data = selector.xpath('//div[@id="test2"]/font/text()').extract()[0]
又只能提取到“你的微信是多少卷拘?”
到底我們要怎樣才能把“美女,你的微信是多少”提取出來祝高?
可以使用xpath的string(.)來達到目的
data = selector.xpath('//div[@id="test2"])
info = data.xpath('string(.)').extract()[0]
輕松搞定栗弟,沒有后顧之憂!工闺!
轉載請告知UШ铡!博主個人博客:http://www.kingboung.me
文章有不完善的地方陆蟆,請留言告知雷厂!My lord