Python爬蟲資料提取方式——使用xpath提取頁面資料
阿新 • • 發佈:2019-02-06
xpath:跟re,bs4,pyquery一樣,都是頁面資料提取方法。
xpath是根據元素的路徑來查詢頁面元素。
安裝lxml包:pip install lxml
HTML例項:
html = """ <div id='content'> <ul class='list'> <li class='one'>One</li> <li class='two'>Two</li> <li class='three'>Three</li> <li class='four four1 four2 four3'>Four</li> <div id='inner'> <a href='http://www.baidu.com'>百度一下</a> <p>第一段</p> <p>第2段</p> <p>第3段</p> <p> 第4段 <span>法大師傅大師傅</span> </p> <p>第5段</p> <p>第6段</p> </div> </ul> </div> """
將一個Html檔案解析成為物件:
首先匯入:
# element tree: 文件樹物件
from lxml.html import etree
將HTML解析成為物件:
#方式一:使用較多
obj= etree.HTML("index.html")
#方式二:
obj = etree.parse('index.html')
print(type(obj))
開始查詢元素或資料:
注意:
1、 //ul: 從obj中查詢ul,不考慮ul所在的位置。
2、/li: 找到ul下邊的直接子元素li,不包含後代元素。
3、 [@class="one"]: 給標籤設定屬性,用於過濾和篩選
4、xpath()返回的是一個列表:比如
one_li = obj.xpath('//ul/li[@class="one"]')[0]
獲取one_li的文字內容:
one_li = obj.xpath('//ul/li[@class="one"]')[0] print(one_li.xpath('text()')[0]) # 上述寫法的合寫方式 print(obj.xpath('//ul/li[@class="one"]/text()')[0])獲取所有li的文字內容:
all_li = obj.xpath('//ul/li/text()')
獲取所有li的文字內容以及class屬性的值:
all_li = obj.xpath('//ul/li') for li in all_li: class_value = li.xpath('@class')[0] text_value = li.xpath('text()')[0] print(class_value, text_value)
獲取div標籤內部的所有文字:
注意://text():獲取所有後代元素的文字內容
/text():獲取直接子元素的文字,不包含後代元素
print(obj.xpath('//div[@id="inner"]//text()'))
獲取ul中第一個li [1]([1]:第一個li)的文字:print(obj.xpath('//ul/li[1]/text()'))
查詢類名中包含four的li的文字內容:print(obj.xpath('//ul/li[contains(@class, "four")]/text()'))