一、xpath解析原理:
- 实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
- 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
二、环境的安装:
- pip install lxml
三、如何实例化一个etree对象 from lxml.html import etree
1、将本地的html文档中的源码数据加载到etree对象中
etree.parse(filePath)
2、可以将从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')
3、xpath('xpath表达式')
四、xpath表达式
一个斜杠 / 表示的是从根节点开始定位,表示的是一个层级
两个斜杠 // 表示的是多个层级,可以表示从任意位置开始定位
属性定位:
/div[@class="song"] #表示取到class为song的div,其中@是固定写法
#格式
tag[@attrName="attrVallue"]
索引定位:
//div[@class="song"]/p[3]
#表示取到class为song的div下的第三个p标签
#注意:这里的索引是从1开始的
取文本:
/text() #获取的是标签中直系的文本内容
xpath('//div[@class="tang"]//li[5]/a/text()')[0]
#表示取到class为tang的div下的第五个li标签中的a标签的文本内容,因为类型是列表,需要加上[0]获取到最终的文本
//text() #获取标签中非直系的文本内容(所有的内容)
取属性:
# 格式
/@attrName
//div[@class="tang"]/img/@src
#表示获取到class为tang的div下的img标签的src属性
# 爬取58二手房中的房源信息
import requests
from lxml.html import etree
if __name__ == '__main__':
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
# 爬取到页面源码数据
url = 'https://gz.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')
fp = open('58.txt','w',encoding='utf-8')
for li in li_list:
# 局部解析
title = li.xpath('./div[2]/h2/a/text()')[0] # .表示解析的源码的参照标签
print(title)
fp.write(title+'
')