数据解析–xpath:最常用且最高效的解析方式。通用性
- xpath解析原理
- 1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
- 2、调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
- pip install lxml
- 实例化一个etree对象
- 1、将本地的html文档中的源码数据加载到etree对象中:
etree.parse(filePath)
- 2、从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')
- xpath('xpath表达式')
- /:表示的从根节点开始定位。表示的是一个层级。
- // :表示的是多个层级。可以表示从任意定位开始定位。
tree = etree.parse('test.html')
r = tree.xpath('/html/head/title') # 返回的是对象类型列表
r = tree.xpath('//div[@class="song"]') # [@]表示的是属性值
r = tree.xpath('//div[@class="song"]/p[3]') # 索引定位,索引的下标是从1开始
- 取文本:
- /text() 获取标签中的直系文本
- //text() 获取标签下的所有文本内容
r = tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]
- 取属性:
r = tree.xpath('//div[@class="song"]/img/@src')[0]
xpath小案例
import requests
from lxml import etree
if __name__ == "__main__":
url = "http://www.aqistudy.cn/historydata"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0'
}
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
with open('./home.txt', 'w', encoding='UTF-8') as fp:
fp.write('热门城市:\n')
hot_city = tree.xpath('//div[@class="hot"]//ul[@class="unstyled"]/li/a/text()')
for h_c in hot_city:
fp.write(h_c + '\t')
fp.write('\n')
fp.write('全部城市:\n')
city_list = tree.xpath('//div[@class="all"]/div[@class="bottom"]/ul')
for ul_i in city_list:
fp.write(ul_i.xpath('./div[1]/b/text()')[0] + '\n')
city = ul_i.xpath('./div[2]/li/a/text()')
for c in city:
fp.write(c + '\t')
fp.write('\n')
fp.close()