xpath解析:最常用且便捷高效的解析方式,通用性
1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
2、调用etree对象中的xpath方法结合这xpath表示式实现标签的定位和内容的捕获
环境的安装
1、pip install lxml
如何实例化一个etree对象 :from lxml import etree
1、将本地的html文档中的源码数据加载到etree对象中
etree.parse(filepath)
2、可以从互联网获取的源码数据加载到该对象中
etree.HTML(page_text)
xpath(‘xpath表达式’)
/表示从根节点开始定位,表示一个层级
r=tree.xpath('/ht,l/body/div')
//表示的是多个层级,可以表示从任意位置开始定位
r=tree.xpath('/html//div')
r=tree.xpath('//div')
属性定位
//div[@属性名='属性值'] tag[@属性名=属性值]
索引定位
#(索引下标从1开始计算)
r= tree.xpath('//div[@属性名=属性值]/标签名[索引下标]')
取文本
标签中直系文本内容
/text() #列表
/text()[下标] #文本
标签中非直系(所有文本内容)
//text()
取属性
/@attrname(属性名)
# -*- coding: utf-8 -*-
import requests
from lxml import etree
if __name__ == '__main__':
#爬取页面源码数据
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
}
url='https://bj.58.com/ershoufang/'
page_text = requests.get(url=url,headers=headers).text
#数据解析
tree = etree.HTML(page_text)
#li标签对象列表
li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')
#print(li_list)
fp = open('58.txt','w',encoding='utf-8')
for li in li_list:
#./表示li标签 不加.表示的是根标签
title = li.xpath('./div[2]/h2/a/text()')[0]
# 房屋部分数据
baseinfo= li.xpath('./div[2]/p/span/text()')
#从列标中取出数据,这种方式总觉得不太好,望指正
data = baseinfo[0]+'\t'+baseinfo[1]+'\t'+baseinfo[2]
#价格
price = li.xpath('./div[3]/p[2]/text()')[0]
print(title+'\n'+data+'\n'+price+'\n\n')
fp.write(title+'\n'+data+'\n'+price+'\n\n')