一、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 requestsfrom lxml import etreeimport osif __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).textpage_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 requestsfrom lxml import etreeif __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.textpage_tree = etree.HTML(response_text)# 获取页面的li集合,里面有a标签li_list = page_tree.xpath("//div[@class='slist']/ul[@class='clearfix']/li")fp = Nonefor 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).contentfp.write(response_b)fp.close()print("图片爬取完毕")
