目录
数据提取概述
响应内容分类
常用解析方法
数据提取-json
json.loads()
json.dumps()
json.load()
json.dump()
数据提取-jsonpath
数据提取-xpath
数据提取-lxml
数据提取概述
响应内容分类
结构化数据
json数据,xml数据
非结构化数据
html
常用解析方法
结构化数据 json
json模块,jsonpath,re
xml模块,xpath,re
非结构化数据html
re,xpath+lxml,bs4(CSS选择器方式提取),pyquery
数据提取-json
json.loads()
将json数据转换为Pyhton类型,字典,列表
json.dumps()
将Python数据类型转换为json数据类型
json.load()
将文件中json数据类型转换为Python数据类型
json.dump()
将Python类型使用dump直接写入到文件
数据提取-jsonpath
使用场景: 当json数据或者是字典数据,嵌套的层级比较多,那么直接使用 字典根据key取值,就相对比较麻烦,可以使用jsonpath模块来解决这个痛点。
my_dict = {"key1": {"key2": {"key3": {"key4": {"key5": {"key6": {"key7": "py46"}}}}}}}
result = my_dict.get('key1').get('key2').get('key3').get('key4').get('key5').get('key6').get('key7')
print(result)
from jsonpath import jsonpath
res = jsonpath(my_dict, "$..key7")
print(res[0])
?
数据提取-xpath
一般 lxml模块结合xpath语法,来完成对非结构化数据html的提取。
xpath是一个独立的语法,类似于前面的学的re
xpath 可以在 html 或者 xml中去 根据规则(路径) 去定位到某一个(某些) 标签,并且可以去获取标签下的文本以及属性信息。
?2.安装Xpath
3,基本语法
?4.查找特定的节点
数据提取-lxml
?
from lxml import etree
from pprint import pprint
import request
url = ‘https:www.baidu.com’
response = requests.get(ur)
html_str = response.content.decode()
# 将html字符串转换成element对象
element = etree.HTML(html_str)
# print(element)
result = etree.tostring(element).decode()
print(result)
# # 在element对象中就有一个方法 xpath()
# a_list = element.xpath("//li/a/text()")
# a_href = element.xpath("//li/a/@href")
# # print(a_list, a_href)
#
# # 每一个li标签下的a应该是一个新闻数据 [{title: xxx, href: xxxx}, {}]
# news_list = []
# for title in a_list:
# item = {}
# item["title"] = title
# item["href"] = a_href[a_list.index(title)]
# news_list.append(item)
#
# pprint(news_list)
# 先分组 再提取
# 先获取到所有的a标签
# a_list = element.xpath('//a')
# # 遍历每一个a标签,
# news_list = []
# for a in a_list:
# item = {}
# # item['title'] = a.xpath("text()")[0]
# item['title'] = a.xpath("./text()")[0]
# item['href'] = a.xpath("./@href")[0] if len(a.xpath("./@href")) > 0 else None
# news_list.append(item)
#
# pprint(news_list)
豆瓣案例
import requests
from lxml import etree
from pprint import pprint
class DouBanSpider(object):
def __init__(self):
self.url = "https://movie.douban.com/top250"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
}
def send_request(self, url):
response = requests.get(url, headers=self.headers)
return response.content.decode()
def parse_data(self, html_str):
# 1. 将html字符串转换成element对象
element = etree.HTML(html_str)
# 先分组 再提取
li_list = element.xpath("//ol[@class='grid_view']/li")
movie_list = []
for li in li_list:
item = {}
item['title'] = li.xpath(".//span[@class='title'][1]/text()")[0]
item['href'] = li.xpath(".//div[@class='hd']/a/@href")[0]
item['info'] = li.xpath(".//div[@class='bd']/p/text()")
item['info'] = [temp.strip() for temp in item['info']]
item['rating_num'] = li.xpath(".//span[@class='rating_num']/text()")[0]
item['href'] = li.xpath(".//div[@class='star']/span[last()]/text()")[0]
item['desc'] = li.xpath(".//span[@class='inq']/text()")[0]
movie_list.append(item)
return movie_list
def save_data(self):
pass
def start(self):
html_str = self.send_request(self.url)
movie_list = self.parse_data(html_str)
if __name__ == '__main__':
spider = DouBanSpider()
spider.start()
|