在學(xué)習(xí)本小節(jié)的知識之前,對于Xpath的語法最好有一個簡單的了解若贮。如果不是很了解的省有,可以看一下我的另一篇文章Xpath之爬蟲常用方法總結(jié)痒留。
爬蟲數(shù)據(jù)Xpath處理步驟
- lxml
在Python爬蟲(七)數(shù)據(jù)處理方法之JSON中我們講到,通過response.content.decode()解碼之后得到的是str類型的數(shù)據(jù)蠢沿。若想得到支持我們使用xpath進行提取數(shù)據(jù)的Element對象伸头,則需要用到python中的另外一個庫lxml。
lxml是python的一個解析庫舷蟀,支持HTML和XML的解析熊锭,支持XPath解析方式,而且解析效率非常高雪侥。通過lxml下的etree.HTML()對html文本進行解析,得到Element對象精绎。其使用方法非常簡單:etree.HTML(html文本)
下面通過一個簡單的例子速缨,我們來看看etree.HTML輸出了什么類型數(shù)據(jù)。
from lxml import etree
url = 'http://http://fanyi.youdao.com/'
response = requests.get(url, headers=headers)
html_str = response.content.decode()
print(type(html_str))
html = etree.HTML(html_str)
print(html)
輸出結(jié)果如下:<class 'str'> <Element html at 0x3290f88>
代乃,這說明了通過etree.HTML得到了html的Element對象旬牲。
- Xpath提取數(shù)據(jù)
得到了Element對象之后,我們就可以利用Xpath對網(wǎng)頁的數(shù)據(jù)進行提取搁吓。接下來我們以豆瓣書籍下的日本文學(xué)排名有例子原茅,講解怎么提取數(shù)據(jù)。豆瓣Xpath.png
通過xpath helper我們自己定位到書名的xpath為//ul[@class="subject-list"]/li/div[2]/h2/a/text()
堕仔。
import requests
from lxml import etree
url1 = 'https://book.douban.com/tag/%E6%97%A5%E6%9C%AC%E6%96%87%E5%AD%A6?start=0&type=T/'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
response = requests.get(url1, headers=headers)
html_str = response.content.decode()
html = etree.HTML(html_str)
#創(chuàng)建xpath列表
html_name = html.xpath("http://ul[@class='subject-list']/li")
for li in html_name:
item = {}
#獲取到每一個li下的書籍名字擂橘,并去除多余的\n
item['name'] = li.xpath('./div[2]/h2/a/text()')[0].replace("\\n", " ").strip()
print(item)
輸出結(jié)果如下:豆瓣輸出結(jié)果.png
至此,我們就爬取到了該網(wǎng)頁下的所有書籍名字了摩骨。
- 總結(jié)
使用xpath提取爬蟲數(shù)據(jù)一共就兩個步驟:
1.通過etree.HTML()
獲取到html的Element對象通贞。
2.通過html.xpath(xpath路徑)
提取到我們想要的數(shù)據(jù)。