一、xpath数据解析
最常用且最便捷高效的一种解析方式
1、xpath解析原理
- 实例化一个 etree 的对象,并且将被解析的页面源码加载到该对象中。
- 调用etree对象中的xpath方法结合 xpath表达式 实现标签对位和内容的捕获。
2、xpath 环境安装
pip install lxml3、如何实例化etree 对象
**from lxml import etree**
- 将本地的html文档中的源码数据 加载到etree对象中:
**etree.parse(filePath)**
- 可以将从互联网上获取的源码数据加载到该对象中:
**etree.HTML(page_text)**
tree.xpath('xpath表达式') # xpath方法没有代码提示
返回一个列表 里面存储了元素
4、xpath表达式:
类型 | 序号 | 语句 | 介绍 |
---|---|---|---|
定位元素 | 1 | / | 如果在开头表示的是从根节点开始定位 。同时也表示的是一个层级 |
2 | // | 表示多个层级,等同于bs4 select方法的 空格 | |
3 | ‘//div’ | //在最左侧则表示从任意位置找div标签 [返回列表] | |
4 | //div[@class=’song’] | 属性定位,定位class为song的div 返回列表 标签[@attrName=”…”] |
|
5 | //div[@class=’ss’]/p[3] | 索引定位 不是从0开始 从1开始 ,查找第三个 | |
取文本 | 6 | //ul[@id=’nav_left’]/li[3]/a/text() | /text() 返回一个列表,里面有当前内文本信息 获取标签中直系的文本内容 |
7 | //text() | //text() 返回一个列表 返回一个标签下所有层级的文本 获取标签中非直系的文本内容(所有的文本内容) |
|
取属性 | 8 | //li[3]/a/@href | 获得a 标签的href属性 /@属性 |
5、注意事项:
给局部节点调用
xpath()
方法时,一定要记得在xpath表达式前加上**./**
如果页面乱码 就把 response的encoding属性改成 网页的head标签中
<meta charset="gbk">
一致 即可
通用处理局部乱码的解决方案
**img_name = img_name.code('iso-8859-1').decode('gbk')**
xpath表达式 可以使用 | 来执行两个xpath表达式 或 【更强的通用性】
tree.xpath("xpath表达式1 | xpath表达式2")
6、爬取58同城房源信息
import requests
from lxml import etree
import os
if __name__ == '__main__':
url = "https://sjz.58.com/ershoufang/"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
}
page_text = requests.get(url, headers=headers).text
page_tree = etree.HTML(page_text)
li_list = page_tree.xpath("//div[@class='content-side-left']/ul[@class='house-list-wrap']/li")
fp = open("./二手房/二手房信息.txt", "w", encoding="utf-8")
for li in li_list:
# xpath表达式一定要加上 ./ 表示从局部的开始定位元素
info_text = li.xpath("./div[@class='list-info']/h2/a/text()")[0] + "\n"
fp.write(info_text)
print("房源信息爬取完毕")
7、爬取4k图片
import requests
from lxml import etree
if __name__ == '__main__':
url = "http://pic.netbian.com/4kmingxing/"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
}
response = requests.get(url, headers=headers)
# 设置编码格式,要和网页的head标签中<meta charset="gbk"> 一致
response.encoding = "gbk"
response_text = response.text
page_tree = etree.HTML(response_text)
# 获取页面的li集合,里面有a标签
li_list = page_tree.xpath("//div[@class='slist']/ul[@class='clearfix']/li")
fp = None
for li in li_list:
img_src = "http://pic.netbian.com" + li.xpath("./a/img/@src")[0]
file_name = li.xpath("./a/img/@alt")[0] + ".jpg"
print("%s 爬取完毕" % file_name)
fp = open("./4k图片/"+file_name, "wb")
response_b = requests.get(img_src).content
fp.write(response_b)
fp.close()
print("图片爬取完毕")