目錄:
- Python網(wǎng)絡(luò)爬蟲(一)- 入門基礎(chǔ)
- Python網(wǎng)絡(luò)爬蟲(二)- urllib爬蟲案例
- Python網(wǎng)絡(luò)爬蟲(三)- 爬蟲進(jìn)階
- Python網(wǎng)絡(luò)爬蟲(四)- XPath
- Python網(wǎng)絡(luò)爬蟲(五)- Requests和Beautiful Soup
- Python網(wǎng)絡(luò)爬蟲(六)- Scrapy框架
- Python網(wǎng)絡(luò)爬蟲(七)- 深度爬蟲CrawlSpider
- Python網(wǎng)絡(luò)爬蟲(八) - 利用有道詞典實現(xiàn)一個簡單翻譯程序
1.XPath
XPath 即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言鸦做。它使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點或節(jié)點集第岖。節(jié)點是通過沿著路徑 (path) 或者步 (steps) 來選取的黎侈。
XPath語法
2.XPath在python中的應(yīng)用
-
xpath在Python中有一個第三方庫,支持~ lxml
注意:不要直接使用pip install lxml去安裝~直接安裝很容易安裝一個空殼! -
安裝pip,主要參考博客:
- python實踐系列之(一)安裝
- python︱模塊加載(pip安裝)以及pycharm安裝與報錯解決方式
- 在shell中輸入
import pip; print(pip.pep425tags.get_supported())
可以獲取到pip支持的文件名還有版本
-
xpath的安裝
- 通過wheel方式安裝
- 下載對應(yīng)的wheel文件【和Python版本對應(yīng)的】
- 安裝wheel插件 :
python2 -m pip install wheel
- 根據(jù)下載的本地文件安裝lxml:切換到whl文件所在的路徑沿彭,進(jìn)行安裝
python2 -m pip install lxml-3.8.0-cp27-none-win32.whl
wheel名一定要跟pip支持的文件名和版本符合
-
xpath的使用
- 獲取文本內(nèi)容用 text()
- 獲取注釋用 comment()
- 獲取其它任何屬性用@xx,如
- @href
- @src
- @value
3.XPath中的text()和string()區(qū)別
1.XPath中的text()和string()本質(zhì)區(qū)別
-
text()
是一個node test尖滚,而string()
是一個函數(shù)喉刘,data()是一個函數(shù)且可以保留數(shù)據(jù)類型。此外漆弄,還有點號(.)表示當(dāng)前節(jié)點睦裳。
2.XML例子:
<book><author>_知幾</author></book>
用例 | 舉例 |
---|---|
text() | book/author/text() |
string() | book/author/string() |
data() | book/author/data() |
. | book/author/. |
3.特殊用例
XML例子:
<book>
<author>python<em>django</em>爬蟲</author>
<pricing>
<price>20</price>
<discount>0.8</discount>
</pricing>
</book>
-
text()
- 經(jīng)常在XPath表達(dá)式的最后看到
text()
,它僅僅返回所指元素的文本內(nèi)容撼唾。
- 經(jīng)常在XPath表達(dá)式的最后看到
let $x := book/author/text() return $x
返回的結(jié)果是python 爬蟲廉邑,其中的django不屬于author直接的節(jié)點內(nèi)容。
-
string()
-
string()
函數(shù)會得到所指元素的所有節(jié)點文本內(nèi)容倒谷,這些文本講會被拼接成一個字符串蛛蒙。
-
let $x := book/author/string() return $x
返回的內(nèi)容是python django 爬蟲。
-
data()
- 大多數(shù)時候渤愁,
data()
函數(shù)和string()
函數(shù)通用牵祟,而且不建議經(jīng)常使用data()
函數(shù),有數(shù)據(jù)表明抖格,該函數(shù)會影響XPath的性能诺苹。
- 大多數(shù)時候渤愁,
let $x := book/pricing/string() return $x
返回的是200.8
let $x := book/pricing/data() return $x
這樣將返回分開的20和0.8咕晋,他們的類型并不是字符串而是>xs:anyAtomicType,于是就可以使用數(shù)學(xué)函數(shù)做一定操作收奔。
let $x := book/pricing/price/data() let $y := book/pricing/discount/data() return $x*$y
比如上面這個例子掌呜,就只能使用
data()
,不能使用text()
或string()
坪哄,因為XPath不支持字符串做數(shù)學(xué)運算站辉。
text()
不是函數(shù),XML結(jié)構(gòu)的細(xì)微變化损姜,可能會使得結(jié)果與預(yù)期不符饰剥,應(yīng)該盡量少用,data()
作為特殊用途的函數(shù)摧阅,可能會出現(xiàn)性能問題汰蓉,如無特殊需要盡量不用,string()
函數(shù)可以滿足大部分的需求棒卷。
4.爬取誅仙前50章內(nèi)容
主要分三個步驟:
(1)分析小說網(wǎng)址構(gòu)成顾孽;
(2)獲取網(wǎng)頁,并分離出小說章節(jié)名和章節(jié)內(nèi)容比规;
(3)寫入txt文檔若厚。
代碼操作:
# -*- coding:utf-8 -*-
import urllib,urllib2,re
from lxml import etree
#定義函數(shù),爬取對應(yīng)的數(shù)據(jù)
def getText(url,file_name):
print('開始爬取第%s章的內(nèi)容'%file_name)
#偽裝請求頭
my_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
}
request = urllib2.Request(url,headers=my_headers)
content = urllib2.urlopen(request).read()
return content
#定義函數(shù)蜒什,保存爬取到的數(shù)據(jù)
def save(content):
xml = etree.HTML(content)
datas = xml.xpath('/html/body/div[@id="main"]/h1 | /html/body/div[@id="main"]/p')
data = datas[2].xpath('string(.)').encode('utf-8')
name = datas[0].xpath('string(.)')
print name
print('第%s章的內(nèi)容爬取完成' % file_name)
with open('txt/%s'%name+'.txt', 'wb') as f:
f.write(data)
#定義主程序接口
if __name__ == '__main__':
x=41277
x_end = x+50
while x<x_end:
url = 'http://www.ty2016.net/net/zhuxian/'+str(x)+'.html'
x+=1
file_name = str(x-41278)
try:
content = getText(url,file_name)
save(content)
except Exception,a:
print a
注解:Xpath的獲取
如果你覺得我的文章還可以测秸,可以關(guān)注我的微信公眾號:Python攻城獅