Python網絡爬蟲(四) XPath

###目錄:

#1.XPath XPath 即爲XML路徑語言(XML Path Language),它是一種用來肯定XML文檔中某部分位置的語言。它使用路徑表達式來選取 XML 文檔中的節點或節點集。節點是經過沿着路徑 (path) 或者步 (steps) 來選取的。 XPath語法css

#2.XPath在python中的應用html

  • xpath的安裝node

    • 經過wheel方式安裝
    • 下載對應的wheel文件【和Python版本對應的】
    • 安裝wheel插件 :python2 -m pip install wheel
    • 根據下載的本地文件安裝lxml:切換到whl文件所在的路徑,進行安裝 python2 -m pip install lxml-3.8.0-cp27-none-win32.whlwheel名必定要跟pip支持的文件名和版本符合
  • xpath的使用python

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

  • CSS 選擇器參考手冊 ###3.XPath中的text()和string()區別django

#####1.XPath中的text()和string()本質區別bash

  • text()是一個node test,而string()是一個函數,data()是一個函數且能夠保留數據類型。此外,還有點號(.)表示當前節點。

####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()
    • 常常在XPath表達式的最後看到text(),它僅僅返回所指元素的文本內容。
let $x := book/author/text()
return $x
複製代碼

返回的結果是python 爬蟲,其中的django不屬於author直接的節點內容。ide

  • string()
    • string()函數會獲得所指元素的全部節點文本內容,這些文本講會被拼接成一個字符串。
let $x := book/author/string()
return $x
複製代碼

返回的內容是python django 爬蟲

  • data()

    • 大多數時候,data()函數和string()函數通用,並且不建議常常使用data()函數,有數據代表,該函數會影響XPath的性能。
let $x := book/pricing/string()
return $x
複製代碼

返回的是200.8

let $x := book/pricing/data()
return $x
複製代碼

這樣將返回分開的20和0.8,他們的類型並非字符串而是>xs:anyAtomicType,因而就能夠使用數學函數作必定操做。

let $x := book/pricing/price/data()
let $y := book/pricing/discount/data()
return $x*$y
複製代碼

好比上面這個例子,就只能使用data(),不能使用text()string(),由於XPath不支持字符串作數學運算。

text()不是函數,XML結構的細微變化,可能會使得結果與預期不符,應該儘可能少用,data()做爲特殊用途的函數,可能會出現性能問題,如無特殊須要儘可能不用,string()函數能夠知足大部分的需求。

###4.爬取誅仙前50章內容 ####主要分三個步驟:

(1)分析小說網址構成;

(2)獲取網頁,並分離出小說章節名和章節內容;

(3)寫入txt文檔。

####代碼操做:

# -*- coding:utf-8 -*-
import urllib,urllib2,re
from lxml import etree

#定義函數,爬取對應的數據
def getText(url,file_name):
    print('開始爬取第%s章的內容'%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

#定義函數,保存爬取到的數據
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章的內容爬取完成' % file_name)
    with open('txt/%s'%name+'.txt', 'wb') as f:
        f.write(data)


#定義主程序接口
if __name__ == '__main__':
    x=41277
    while x<x+50:
        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的獲取
獲取數據的Xpath
相關文章
相關標籤/搜索