在爬虫中,数据解析方法有很多种,比如正则表达式、bs4、Xpath、pyquery等,这个专栏所涉及到的爬虫主要以Xpath为主。
Xpath解析:最常用且最便捷高效的一种解析方式,通用性强。
(1)实例化一个etree对象,且需要将被解析的页面源码数据加载到该对象中;
(2)调用etree对象中的Xpath方法结合Xpath表达式实现标签的定位和内容的获取。
pip install lxml
首先,先导入lxml中的etree包。
from lxml import etree
(1)第一种情况:将本地的html文档中的源码数据加载到etree对象中;
tree = etree.parse(filepath)
(2)第二种情况:将从互联网上获取到的源码数据加载到该对象中;
tree = etree.HTML(text)
(1)/:单斜杠从根节点开始定位,表示一个层级;比如:'/html/body/div',一层一层递进;
(2)//:双斜杠可以从任意位置开始定位,表示多个层级;比如:'//div',直接跳到指定位置;
(3)属性定位://div[@class='xxx'] 其中,div为网页的块状标签,class为该div标签的唯一属性值;
(4)索引定位://div[@class='xxx']/p[3] 直接跳到class为'xxx'的div标签,再跳下一层第三个p标签(索引从1开始);
(5)取文本:
/text() 获取的是标签中直系的文本内容;
//text() 获取的是标签中非直系的文本内容(指定标签下所有的文本内容);
#/text()例:
r = tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]
#获取 class为'tang'的div标签 --> 第5个li标签 --> a标签 --> 文本内容列表的第一个元素
#//text()例:
r = tree.xpath('//li[7]//text()') #获取第7个li标签下的所有文本内容
(6)取属性:/@attrName (attrName为属性名,比如:图片img/src)
#例如:
r = tree.xpath('//div[@class="song"]/img/src')
(1)导入相关Python包
from lxml import etree
import requests
(2)指定url
url = 'https://bj.58.com/ershoufang/'
(3)进行UA伪装
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
}
(4)请求发送
page_text = requests.get(url=url, headers=headers).text
(5)数据解析
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@class="house-list-wrap"]/li') #存储的就是li标签对象
(6)持久化存储
fp = open('58.txt', 'w', encoding='utf-8')
for li in li_list:
title = li.xpath('./div[2]/h2/a/text()')[0] #获取小区名称
price = li.xpath('./div[3]/p/b/text()')[0] + '万' #获取小区房价
print(title + ',' + price)
fp.write(title + ',' + price + '\n')