目录
- 一、概述
-
- 1. 响应内容分类
- 2. xml和html
- 3. 数据解析
- 二、jsonpath模块
-
- 1. 提取数据的方法
- 2. jsonpath语法规则
- 3. jsonpath练习:获取拉钩网城市json文件中城市的名字
- 三、lxml模块
-
- 1. lxml模块和xpath语法
- 2. xpath helper插件
- 3. xpath 语法_如何找节点
- 4.xpath语法_节点修饰语法
-
- ① 通过索引
- ② 通过属性值
- ③ 通过子节点的值修饰节点
- ④通过包含修饰
- 5. xpath语法_通配符
- 6.使用
- 爬取某个贴吧的评论
一、概述
1. 响应内容分类
- 结构化 (json数据、xml数据
- 非结构化 (html
2. xml和html
- xml是一种可扩展标记语言Extensible Markup Language,形似html,功能更专注于传输、存储数据,焦点是更好的显示数据
- html 超文本标记语言HyperText Markup Language,更好的显示数据
-
3. 数据解析
二、jsonpath模块
多层嵌套的复杂字典,jsonpath可以直接提取
1. 提取数据的方法
from jsonpath import jsonpath
ret = jsonpath(a, 'jsonpath语法规则字符串')
2. jsonpath语法规则
$
根节点
.
子节点
..
内部任意位置
from jsonpath import jsonpath
data = {
'key1':{
'key2':{
'key3': 'nihao'}}}
print(data['key1']['key2']['key3'])
print(jsonpath(data,'$..key3')[0])
3. jsonpath练习:获取拉钩网城市json文件中城市的名字
http://www.lagou.com/lbs/getAllCitySearchLabels.json
import requests
import jsonpath
import json
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40'
}
response = requests.get('https://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'))
三、lxml模块
1. lxml模块和xpath语法
- Xpath(XML path language)在HTML\XML文档中特定元素以及获取节点信息(文本内容,属性值),对元素、属性,进行遍历
2. xpath helper插件
3. xpath 语法_如何找节点
\
隔开的是标签(节点)
nodename |
选中该元素 |
html |
/ |
绝对路径 |
/html/head/title |
// |
相对路径 |
/html//title |
. |
当前节点 |
|
.. |
当前节点的上一节点 |
|
@ |
抽取节点后的一个属性 |
//title/@href |
text() |
开闭标签之间取文本内容 |
//link/text() |
4.xpath语法_节点修饰语法
① 通过索引
路径表达式 |
结果 |
//title[@lang=''eng''] |
选择lang属性值为eng的所有title元素 |
/bookstore/book[1] |
选择属于bookstore子元素的第一个book元素 |
/bookstore/book[last()] |
选择属于bookstore子元素的最后一个book元素 |
/bookstore/book[last()-1] |
选择属于bookstore子元素的倒数第二个book元素 |
/bookstore/book[position()>1] |
选择bookstore下面的book元素,从第二个开始 |
② 通过属性值
路径表达式 |
结果 |
//book/title[text()='Harry Potter'] |
选择bookstore下面的title元素,仅选择文本为hp的元素 |
//div[@id="content-left"]/div/@id |
第一个@是使用标签名标签值修饰节点 第二个/@ 是取属性值 |
③ 通过子节点的值修饰节点
路径表达式 |
结果 |
/bookstore/book[price>35.00] |
选择bookstore下面的title元素,仅选择文本为hp的元素 |
④通过包含修饰
路径表达式 |
结果 |
//div[contains(@id,"qiushi_tag_")] |
contains(属性名,属性值) |
5. xpath语法_通配符
通配符 |
|
* |
所有节点 |
@* |
所有节点的属性 |
node() |
匹配任何类型的节点 |
6.使用
from lxml import etree
html = etree.HTML(text)
List = html.xpath("xpath语法规则字符串")
爬取某个贴吧的评论
下一页尽量不使用索引
import requests
from lxml import etree
class Tieba(object):
def __init__(self,name):
self.url = "https://tieba.baidu.com/f?kw={}".format(name)
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
}
def get_data(self,url):
response = requests.get(url, headers=self.headers)
with open("temp.html","wb")as f:
f.write(response.content)
return response.content
def parse_data(self,data):
data = data.decode().replace("","")
html = etree.HTML(data)
el_list = html.xpath('//*[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a')
data_list = []
for el in el_list:
temp = {
}
temp['title'] = el.xpath("./text()")[0]
temp['link'] = 'http://tieba.baidu.com' + el.xpath("./@href")[0]
data_list.append(temp)
try:
next_url = 'https:'+html.xpath('//a[contains(text(),"下一页>")]/@href')[0]
except:
next_url = None
print(next_url)
return data_list, next_url
def save_data(self, data_list):
for data in data_list:
print(data)
def run(self):
next_url = self.url
while True:
data = self.get_data(next_url)
data_list, next_url = self.parse_data(data)
self.save_data(data_list)
print(next_url)
if next_url == None:
break
if __name__ == '__main__':
tieba = Tieba(" ")
tieba.run()
改了好久!嘿嘿coding 有趣!