网页提取的工具

1.xpath
什么是xpath?
xml是用来存储和传输数据使用的
和html的差异:
(1) html用来显示数据,xml是用来传输数据的
(2) html标签是固定的,xml标签是自定义的
XPath 是一门在 XML 文档中查找信息的语言,他是一种路径表达式

常见的路径表达式
// :不考虑位置的查找
./ :从当前节点往下面查找
@ :选取属性

示例:
/bookstore/book 选取根节点bookstore下的所有直接子节点book
//book 选取所有book
bookstore//book 查找bookstore下的所有book节点
/bookstore/book[1] 选取bookstore下的第一个子元素book
/bookstore/book[last()] 选取bookstore下的最后一个子元素book
/bookstore/book[position()<3] 选取bookstore下的前两个子元素book
//title[@lang] 选取所有带有lang属性的title
//title[@lang='eng'] 选取所有带有lang属性值为eng的title
* 任何元素节点

属性定位 //input[@id='kw']
层级定位 //div[@id="head"]/div/div[3]/a[1] 通过子节点和索引(从1开始) 进行定位

逻辑运算 and
# 包含class属性,并且属性中带有's'
模糊匹配 //input[contains(@class,"s")]
//input[starts-with(@class,"s")]
取文本 //div[@id="u1"]/a[5]/text()
# 获取div下面的所有text,包括其他标签中的文本
//div[@id="u1"]//text()
取属性 //div[@id="u1"]/a[5]/@href

2.bs4 BeautifulSoup
(1) 根据标签名查找

(2)
from bs4 import BeautifulSoup

# 生成对象
soup = BeautifulSoup(open('soup.html', encoding="utf8"), 'html.parser')
# print(type(soup))
# print(soup.a) # 只能找到第一个符合条件的标签
# print(soup.a['href']) # 利用字典的形式获取标签中的属性 soup.a.attrs['href']
# print(soup.a.attrs) # 返回一个所有属性组成的字典
# print(soup.a.string) # 获取标签的内容 soup.a.text soup.a.get_text() 获取的结果相同
# print(soup.a.get_text())
# print(soup.a.text)
# 上述三个有何差异呢?
# print(soup.div.string) # None 如果标签中还有标签,那么string获取None,而其他两个,可以获取文本
# print(soup.div.text)
# print(soup.div.get_text())
# find方法
# print(soup.find('a')) # soup.a 找到第一个符合条件的标签
# print(soup.find('a', class_="du")) # class为关键字 class_="xxx"
# div = soup.find('div', class_='tang') # 不仅soup可以使用find方法,普通的div也可以使用find
# print(div.find('a', class_='du'))
# findall 方法
# print(soup.find_all('a')) # 以列表
div = soup.find("div", class_='tang')
# print(div.find_all('a'))
# print(div.find_all(['a', 'b'])) # 寻找div标签下的a和b标签
# print(div.find_all('a', limit=2)) # 取前两个a标签

# select 根据选择器选择指定的内容
# 常见的选择器:标签选择器,类选择器,id选择器,组合选择器,层级选择器,伪类选择器,属性选择器
# select选择器永远返回的是列表
# print(soup.select('.tang > ul > li > a')[2]) # 寻找class=tang下面的子标签ul下面的li下面的a标签
# print(soup.select('#feng')[0].string) # 查找id=feng的标签
print(div.select('.du'))

3.jsonpath:用来解析json数据使用的
Python处理json格式

import json
json.dumps() # 将字典或列表转化为json格式
json.loads() # 将json格式字符串转化为python对象
# json.dump(list,open("json.txt","w",encoding="utf8"))
json.dump() # 将字典或列表转化为json格式并且写入文件中
json.load() # 从文件中读取json格式字符串,转化为python对象
前端处理:
json.parse('json格式字符串') # 将json格式字符串转化为js对象
eval('('+ json格式字符串 + ')')
安装
import jsonpath
import json

# 将json字符串转化为python对象
obj = json.load(open("book", "r", encoding='utf8'))
# 查找第一本书的作者
# ret = jsonpath.jsonpath(obj, '$.store.book[0].author')
# 查找book下面的所有作者
# ret = jsonpath.jsonpath(obj, '$.store.book[*].author')
# 查找所有作者
# ret = jsonpath.jsonpath(obj, '$..author')
# 查找store下的所有对象
# ret = jsonpath.jsonpath(obj, '$.store.*')
# 查找store下的所有price
# ret = jsonpath.jsonpath(obj, '$.store..price')
# 查找第三本书,返回一个列表
# ret = jsonpath.jsonpath(obj, '$..book[2]')
# 查找最后一本book
# ret = jsonpath.jsonpath(obj, '$..book[(@.length-1)]')
# 查找第一,二本书
# ret = jsonpath.jsonpath(obj, '$..book[0,1]')
# ret = jsonpath.jsonpath(obj, '$..book[:2]')
# 过滤出所有包含isbn属性的书
# ret = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]')
# 查找所有price<10的书
# ret = jsonpath.jsonpath(obj, '$..book[?(@.price<10)]')

# print(ret)

原文地址:https://www.cnblogs.com/nxrs/p/11372390.html