Python網(wǎng)絡(luò)爬蟲(四)- XPath

目錄:

1.XPath

XPath 即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言鸦做。它使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點或節(jié)點集第岖。節(jié)點是通過沿著路徑 (path) 或者步 (steps) 來選取的黎侈。
XPath語法

2.XPath在python中的應(yīng)用

  • 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.whlwheel名一定要跟pip支持的文件名和版本符合
  • xpath的使用

    • 獲取文本內(nèi)容用 text()
    • 獲取注釋用 comment()
    • 獲取其它任何屬性用@xx,如
      • @href
      • @src
      • @value
  • Python-第三方庫requests詳解

  • CSS 選擇器參考手冊

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)容撼唾。
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的性能诺苹。
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

從本地可以看到已經(jīng)爬取到相關(guān)內(nèi)容

注解:Xpath的獲取
獲取數(shù)據(jù)的Xpath

如果你覺得我的文章還可以测秸,可以關(guān)注我的微信公眾號:Python攻城獅
可掃描二維碼,添加關(guān)注

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灾常,一起剝皮案震驚了整個濱河市霎冯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钞瀑,老刑警劉巖沈撞,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雕什,居然都是意外死亡缠俺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門贷岸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壹士,“玉大人,你說我怎么就攤上這事凰盔∧关裕” “怎么了倦春?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵户敬,是天一觀的道長落剪。 經(jīng)常有香客問我,道長尿庐,這世上最難降的妖魔是什么忠怖? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮抄瑟,結(jié)果婚禮上凡泣,老公的妹妹穿的比我還像新娘。我一直安慰自己皮假,他們只是感情好鞋拟,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惹资,像睡著了一般贺纲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褪测,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天猴誊,我揣著相機(jī)與錄音,去河邊找鬼侮措。 笑死懈叹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的分扎。 我是一名探鬼主播澄成,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼畏吓!你這毒婦竟也來了环揽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤庵佣,失蹤者是張志新(化名)和其女友劉穎歉胶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巴粪,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡通今,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肛根。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辫塌。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖派哲,靈堂內(nèi)的尸體忽然破棺而出臼氨,到底是詐尸還是另有隱情,我是刑警寧澤芭届,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布储矩,位于F島的核電站感耙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏持隧。R本人自食惡果不足惜即硼,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屡拨。 院中可真熱鬧只酥,春花似錦、人聲如沸呀狼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哥艇。三九已至叫胖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間她奥,已是汗流浹背瓮增。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留哩俭,地道東北人绷跑。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像凡资,于是被迫代替她去往敵國和親砸捏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容