初始爬虫6
数据提取
数据提取总结
响应分类
结构化
json数据(高频出现)
json模块
jsonpath模块
xml数据(低频出现)
re模块
xml模块
非结构化
html
re模块
xml模块
xml以及和html的区别
xml传输和存储数据
html展示数据
jsonpath的用法:多层嵌套的复杂字典直接提取数据
常用记住三个就行:$(根节点) .(子节点) ..(相对索引)
练习链接:http://www.lagou.com/lbs/getAllCitySearchLabels.json
# -*- coding: utf-8 -*-
import jsonpath
import requests
import json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
}
response = requests.get('http://www.lagou.com/lbs/getAllCitySearchLabels.json', headers=headers)
dict_data = json.loads(response.content)
# print(jsonpath.jsonpath(dict_data, '$..A..name'))
print(jsonpath.jsonpath(dict_data, '$..name'))
xpath的用法:处理lxml模块
学习链接:XPath 教程 (w3school.com.cn)
使用工具:xpath helper(快速定位所求数据位置)
基本结构
html
/html/head/title
/html/title
//title
//title/text()
//link/@href
- 斜杠隔开的是节点,/ 绝对索引,// 相对索引
说明
//title/text()
: 从当前节点之上获取文本内容。//link/@href
: 从当前节点的子节点中获取属性值。
节点修饰语法:
1.通过索引修饰节点/html/body/div[3]/div/div[1]/div
/html/body/div[3]/div/div[1]/div[3]
/html/body/div[3]/div/div[1]/div[last()] 选中最后一个
/html/body/div[3]/div/div[1]/div[last()-1] 选中倒数第二个
/html/body/div[3]/div/div[1]/div[position()>=10] 范围选择
2.通过属性修饰节点//div[@id="content-left"]/div/@id 第一个@是使用标签属性修饰,第二@个是具体内容
3.通过子节点的值修饰节点//span[i>2000]
//span[2>=9.4]
4.通过包含修饰//div[contains(@id,"qiushi_tag_")]
//span[contains(text(),"—页")]
5.复合使用语法
//h2/a | td/a xpath 复合使用语法(跳转页面后xml结构变化)
***找翻页url时候尽量不要使用索引(翻页后xpath可能就变化不对了)
# -*- coding: utf-8 -*-
from lxml import etree
text = '''
<div>
<ul>
<li class="item-1">
<a href="link1.html">first item</a>
</li>
<li class="item-1">
<a href="link2.html">second item</a>
</li>
<li class="item-inactive">
<a href="link3.html">third item</a>
</li>
<li class="item-1">
<a href="link4.html">fourth item</a>
</li>
<li class="item-0">
<a href="link5.html">fifth item</a>
</li>
</ul>
</div>
'''
# HTML 树结构,结果为字符串或者对象内存地址
html = etree.HTML(text)
# print(html)
# # dir() 查看html对象(即解析后的 HTML 树)所具有的所有属性和方法
# print(dir(html))
# print(html.xpath('//a[@href="link1.html"]/text()'))
# print(html.xpath('//a[@href="link1.html"]/text()')[0])
# 方法一:提取HTML文档中所有链接的文本和对应的链接地址
text_list = html.xpath('//a/text()')
link_list = html.xpath('//a/@href')
# for text in text_list :
# myindex = text_list.index(text)
# link = link_list[myindex]
# print(text,link)
# 方法二:
# for text,link in zip(text_list,link_list):
# print(text,link)
# 方法三:上面方法如果存在数据缺失的情况不能发现问题
el_list = html.xpath('//a')
for el in el_list :
print(el.xpath('./text()')[0],el.xpath('./@href')[0])