-----------------------------------------------------------學無止境------------------------------------------------------html
前言:你們好,歡迎來到譽雪飛舞的博客園,個人每篇文章都是本身用心編寫,python
算不上精心可是足夠用心分享個人自學知識,但願你們可以指正我,互相學習成長。web
轉載請註明:https://www.cnblogs.com/wyl-pi/p/10510599.html學習
這段話從百度就有,給大家省功夫直接看吧。url
XPath的使用方法:
首先講一下XPath的基本語法知識:
四種標籤的使用方法
1) // 雙斜槓 定位根節點,會對全文進行掃描,在文檔中選取全部符合條件的內容,以列表的形式返回。
2) / 單斜槓 尋找當前標籤路徑的下一層路徑標籤或者對當前路標籤內容進行操做
3) /text() 獲取當前路徑下的文本內容
4) /@xxxx 提取當前路徑下標籤的屬性值
5) | 可選符 使用|可選取若干個路徑 如//p | //div 即在當前路徑下選取全部符合條件的p標籤和div標籤。
6) . 點 用來選取當前節點
7) .. 雙點 選取當前節點的父節點
另外還有starts-with(@屬性名稱,屬性字符相同部分),string(.)兩種重要的特殊方法後面將重點講。spa
咳咳,你要確保以上看懂了,否則不須要往下看了。或者看個差很少了也能夠往下,看例子就明白了;code
咱們先普及一下Xpath的基本用法:orm
#xpath的基本使用方法 from lxml import etree web_data = ''' <div> <ul> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-inactive"><a href="link3.html">second item</a></li> <li class="item-1"><a href="link4.html">third item</a></li> <li class="item-0"><a href="link5.html">fourth item</a> </ul> </div> ''' #(1)etree.tostring(html)將標籤補充齊整,是html的基本寫法 html = etree.HTML(web_data.lower()) print("html_1 {}\n".format(html)) print(type(html)) result = etree.tostring(html) print("\n",type(result)) print('''result.decode("utf-8")_1 \n{}\n\n'''.format(result.decode("utf-8"))) #(2.0)獲取標籤裏的內容,獲取a標籤的全部內容,a後面就不用再加「/」不然報錯 html = etree.HTML(web_data) print(type(html)) html_data = html.xpath('/html/body/div/ul/li/a') print("html_2.0 {}".format(html)) for i in html_data: print("i.text_2.0 {}\n".format(i.text)) print("\n") #(2.1)寫法二(直接在須要查找的標籤後面加一個/text()就行) html = etree.HTML(web_data) html_data = html.xpath('/html/body/div/ul/li/a/text()') print("html_2.1 {}".format(html)) for i in html_data: print("i_2.1 {}\n".format(i)) print("\n") #(3)使用pasrse打開html文件 html = etree.parse("xpath_data.xml") html_data = etree.tostring(html,pretty_print=True) res = html_data.decode('utf-8') print(res)
運行結果以下:xml
html_1 <Element html at 0xc4f558>htm
<class 'lxml.etree._Element'>
<class 'bytes'>
result.decode("utf-8")_1
<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-inactive"><a href="link3.html">second item</a></li>
<li class="item-1"><a href="link4.html">third item</a></li>
<li class="item-0"><a href="link5.html">fourth item</a>
</li></ul>
</div>
</body></html>
<class 'lxml.etree._Element'>
html_2.0 <Element html at 0xc79760>
i.text_2.0 first item
i.text_2.0 second item
i.text_2.0 third item
i.text_2.0 fourth item
html_2.1 <Element html at 0xc4f558>
i_2.1 first item
i_2.1 second item
i_2.1 third item
i_2.1 fourth item
<html>
<body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-inactive"><a href="link3.html">second item</a></li>
<li class="item-1"><a href="link4.html">third item</a></li>
<li class="item-0"><a href="link5.html">fourth item</a>
</li></ul>
</div>
</body>
</html>
Xpath的特殊用法:
#xpath特殊用法 from lxml import etree #(1)starts-with解決標籤相同開頭的屬性值 html=""" <body> <div id="aa">aa</div> <div id="ab">ab</div> <div id="ac">ac</div> </body> """ example = etree.HTML(html) content = example.xpath("//div[starts-with(@id,'a')]/text()") for each in content: print(each) print("(1) is over.\n") #(2)string(.)標籤套標籤 html1=""" <div id="a"> left <span id="b"> right <ul> up <li>down</li> </ul> east </span> west </div> """ pil = etree.HTML(html1) data = pil.xpath("//div[@id = 'a']")[0] #print("data's type is {}".format(type(data))) print("data {}\n".format(data)) info = data.xpath("string(.)") #replace是將新的字符串替換舊字符串,第三個參數是max,替換不超過max次; content = info.replace('\n','').replace(' ','') for i in content: print(i) print("(2) is over\n")
運行結果以下:
aa
ab
ac
(1) is over.
data <Element div at 0x36483f0>
l
e
f
t
r
i
g
h
t
u
p
d
o
w
n
e
a
s
t
w
e
s
t
(2) is over
------------------------Xpath Learn_Test Is Over-------------------------
用法介紹完了,咱們的正文終於來了:
Xpath豆瓣口碑周榜爬取程序:
import bs4 import requests from bs4 import BeautifulSoup from lxml import html j = 0 tplt = "{0:{1}^10}" url='https://movie.douban.com/' # 須要爬數據的網址 page=requests.Session().get(url) # 維持一個回話 #print(type(page)) tree=html.fromstring(page.text) # 在解析xml格式時,將字符串轉換爲element對象,解析樹的根節點 result=tree.xpath('//td[@class="title"]//a/text()') #獲取須要的數據 print(tplt.format("Movie_Name Top 10 of Week:",chr(12288))) for i in result: if j<10: print(tplt.format(result[j],chr(12288))) j += 1 #print(result)
裏面要講的也就只有fromstring方法須要講解一下:
fromstring() 能夠在解析xml格式時,將字符串轉換爲Element對象,解析樹的根節點。
在python中,對返回的page.txt作fromstring()處理,能夠方便進行後續的xpath定位等。
如:
page = requests.get(url)
data = html.fromstring(page.text)
getData = data.xpath('........')
運行結果:
總結:
如何呢?我爲您編撰的這兩篇豆瓣電影排行榜python代碼實現感受是否是差異很明顯,首當其衝的就是這個代碼數量少了兩三倍,
可不是一點半點了,因此學習的途徑,方法或者說一個問題的解決方法的的確確是多樣的、豐富的,切忌一成不變一個方法用到 「 海枯石爛 」 ,
咱們要坦然勇於接受比本身優秀的人、事,並從中虛心的去學習他們的閃光點充實本身,爲本身加料,逐漸實現本身的昇華。
相信本身!!!!
相信本身!!!!
相信本身!!!!
大家好我是譽雪飛舞,再會。
若是以爲個人文章還不錯,關注一下,頂一下 ,我將會用心去創做更好的文章,敬請期待。