python3 [入門基礎實戰] 爬蟲入門之xpath的學習

Xpath
Xpath全程爲xml路徑語言,用來確定xml文檔中某部分位置的語言。

使用Xpath需要安裝lxml庫,lxml爲Python的第三方庫,安裝方法可以直接下載庫文件手動添加到python庫文件夾下或者使用pip安裝。

導入模塊 from lxml import etree
Selector=etree.HTML(網頁源代碼) 該指令可以把網頁源代碼轉換成可以
被Xpath識別和匹配的對象,

Selector.xpath() 括號內參數爲一段符號。這樣便可以識別匹配出感興趣的內容。

在使用正則表達式來尋找感興趣內容的時候,需要知道感興趣內容附近內容的特徵。
而Xpath則不同。

Xpath與HTML的結構:
HTML爲樹狀結構,可以逐層展開,逐層定位。Xpath就是根據這一特性來工作的。
其中兩根斜線 // 定位根節點,一根斜線 / 表示往下層尋找,其中一個HTML標籤表示一層,提取文本內容則是 /text() ,要提取某個屬性的內容則 /@xxx (xxx爲具體屬性的名字)。

首先,使用xpath提取一般內容:
根據HTML中的標籤來進行定位。如下面一段簡短代碼:

from lxml import etree
html='''
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>測試-常規用法</title>
</head>
<body>
<div id="content">
    <ul id="useful">
        <li>這是第一條信息</li>
        <li>這是第二條信息</li>
        <li>這是第三條信息</li>
    </ul>
    <ul id=“useless”>
        <li>1不需要的信息</li>
        <li>2不需要的信息</li>
        <li>3不需要的信息</li>
    </ul>

    <div id="url">
        <a href="屬性1">這個不屬於屬性值</a>
        <a href="屬性2" href2="屬性3">這個也不是屬性值</a>
        <a href3="attribute">3也不是屬性值</a>
   </div>
</div>

</body>
</html>
'''
selector=etree.HTML(html)

#提取文本信息
content=selector.xpath('//ul[@id="useful"]/li/text()')
for each in content:
    print each

#此語句打印出了標籤a下的內容
content2=selector.xpath('//a/text()')
for each in content2:
    print each   

#提取屬性
content3=selector.xpath('//a/@href')
for each in content3:
    print each

content4=selector.xpath('//a/@href2')
print content4[0]

content5=selector.xpath('//a[@href3="attribute"]/text()')
print content5[0]

其中html代表一個簡單網頁的源代碼,而使用etree.HTML(html)將源代碼html轉換成xpath可以處理的對象,然後該對象調用xpath成員進行相應處理得到感興趣的內容。
輸出文本
如上面代碼所示xpath成員的參數’//ul[@id=”useful”]/li/text()’該參數表示在根目錄下的ul標籤[]內的內容表示當有多個ul標籤的時候,用中括號中的內容來定位具體哪個標籤,後面的斜槓後li代表li標籤/text()表示要取的是li標籤下的文本內容。此時根據該語句而得到的輸出爲:
這是第一條信息
這是第二條信息
這是第三條信息
該語句中如果把ul後面的中括號去掉,由於html中有兩處ul標籤,且兩處ul標籤下都有li標籤,因此兩處ul下的li都會定位到,因而輸出:
這是第一條信息
這是第二條信息
這是第三條信息
1不需要的信息
2不需要的信息
3不需要的信息

輸出屬性
如上面代碼中提取網頁的代碼:
content3=selector.xpath(‘//a/@href’)
在源代碼html中,href對應的等號右邊爲href的屬性內容,也就是href的值,其定位方式與前面文本定位方式是一樣的,但是取內容方式有差別,取文本內容是直接用text(),而取屬性是用@xxx,xxx爲要取的屬性,該表達式爲取出該屬性具體的內容。同理,content3=selector.xpath(‘//a/@href’)取出了a標籤中href3對應的屬性內容。此處由於有兩處標籤a下都有href,因而返回兩處屬性都會返回,此處打印內容爲:
屬性1
屬性2
注意,xpath取出的內容是以列表形式返回的,因而如果取出其中一個元素或者其中只有一個元素的時候,需要用訪問列表元素的方式來取出。且上面的html內容比較簡單,標籤不復雜,因而xpath中的具體參數也比較簡單,對於標籤層次較多的網頁文件而言,則表達式的層次結構也應該較明確,一層一層標籤標示出來,否則容易導致匹配到其他有相同標籤的內容上去而沒有真正找出感興趣內容。

總結

這個是從http://blog.csdn.net/dalong277/article/details/51465232 複製過來的,覺得很適合自己,而且講的詳細,容易上手。在實戰過程中如果有自己不懂的地方,要學會自己去百度谷歌一下,這樣學的能及時用於實戰中更快。

下一篇是我用xpath爬取的內容,內容有點多,由於自己現在還沒有學到多線程,只能是單線程的進行爬取。喜歡的可以給我點個贊,讓我知道你從我的世界過來過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章