正则,bs4 ,xpath 和jsonpath 的匹配规则
Posted airapple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则,bs4 ,xpath 和jsonpath 的匹配规则相关的知识,希望对你有一定的参考价值。
正则匹配:
规则
单字符:
. : 除换行以外所有字符
[] :[aoe] [a-w] 匹配集合中任意一个字符
\d :数字 [0-9]
\D : 非数字
\w :数字、字母、下划线、中文
\W : 非\w
\s :所有的空白字符
\S : 非空白
数量修饰:
* : 任意多次 >=0
+ : 至少1次 >=1
? : 可有可无 0次或者1次
{m} :固定m次
{m,} :至少m次
{m,n} :m-n次
边界:
\b \B
$ : 以某某结尾
^ : 以某某开头
分组:
(ab){3}
(){4} 视为一个整体
() 子模式\组模式 \1 \2
贪婪模式:
.*? .+?
re.I : 忽略大小写
re.M :多行匹配
re.S :单行匹配
match\search\findall
re.sub(正则表达式, 替换内容, 原字符串)
bs4匹配规则
需要安装:pip install bs4
bs4在使用时候需要一个第三方库,把这个库也安装一下 pip install lxml
简单使用:
说明:选择器,jquery
from bs4 import BeautifulSoup
使用方式:可以将一个html文档,转化为指定的对象,然后通过对象的方法或者属性去查找指定的内容
(1)转化本地文件:
soup = BeautifulSoup(open(‘本地文件‘), ‘lxml‘)
(2)转化网络文件:
soup = BeautifulSoup(‘字符串类型或者字节类型‘, ‘lxml‘)
(1)根据标签名查找
soup.a 只能找到第一个符合要求的标签
(2)获取属性
soup.a.attrs 获取所有的属性和值,返回一个字典
soup.a.attrs[‘href‘] 获取href属性
soup.a[‘href‘] 也可简写为这种形式
(3)获取内容
soup.a.string
soup.a.text
soup.a.get_text()
注意:如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
(4)find
soup.find(‘a‘) 找到第一个符号要求的a
soup.find(‘a‘, title="xxx")
soup.find(‘a‘, alt="xxx")
soup.find(‘a‘, class_="xxx")
soup.find(‘a‘, id="xxx")
注意:find方法不仅soup可以调用,普通的div对象也能调用,会去指定的div里面去查找符合要求的节点
find找到的都是第一个符合要求的标签
(5)find_all
soup.find_all(‘a‘)
soup.find_all([‘a‘, ‘b‘])
soup.find_all(‘a‘, limit=2) 限制前两个
(6)select
根据选择器选择指定的内容
常见的选择器:标签选择器、类选择器、id选择器、组合选择器、层级选择器、伪类选择器、属性选择器
a #标签选择器
.dudu 类选择器
#lala id选择器
a, .dudu, #lala, .meme #组合选择器
div .dudu #lala .meme .xixi #包含选择器
div > p > a > .lala 只能是下面一级 #层级选择器
input[name=‘lala‘] #属性选择器
select选择器返回永远是列表,需要通过下标提取指定的对象,然后获取属性和节点
该方法也可以通过普通对象调用,找到都是这个对象下面符合要求的所有节点
Xpath匹配原则
安装xpath插件
将xpath插件拖动到谷歌浏览器扩展程序中,安装成功
启动和关闭插件
ctrl + shift + x
属性定位
//input[@id="kw"]
//input[@class="bg s_btn"]
层级定位
索引定位
//div[@id="head"]/div/div[2]/a[@class="toindex"]
【注】索引从1开始
//div[@id="head"]//a[@class="toindex"]
【注】双斜杠代表下面所有的a节点,不管位置
逻辑运算
//input[@class="s_ipt" and @name="wd"]
模糊匹配
contains
//input[contains(@class, "s_i")]
所有的input,有class属性,并且属性中带有s_i的节点
//input[contains(text(), "爱")]
starts-with
//input[starts-with(@class, "s")]
所有的input,有class属性,并且属性以s开头
取文本
//div[@id="u1"]/a[5]/text() 获取节点内容
//div[@id="u1"]//text() 获取节点里面不带标签的所有内容
直接将所有的内容拼接起来返回给你
ret = tree.xpath(‘//div[@class="song"]‘)
string = ret[0].xpath(‘string(.)‘)
print(string.replace(‘\n‘, ‘‘).replace(‘\t‘, ‘‘))
取属性
//div[@id="u1"]/a[5]/@href
代码中使用xpath
from lxml import etree
两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找指定的节点
(1)本地文件
tree = etree.parse(文件名)
(2)网络文件
tree = etree.HTML(网页字符串)
ret = tree.xpath(路径表达式)
【注】ret是一个列表
jsonpath匹配规则
jsonpath: 用来解析json数据使用的
Python处理json格式用到的函数
import json
json.dumps() : 将字典或者列表转化为json格式的字符串
json.loads() :将json格式字符串转化为python对象
json.dump() : 将字典或者列表转化为json格式字符串并且写入到文件中
json.load() :从文件中读取json格式字符串,转化为python对象
前端处理:
将json格式字符串转化为js对象
JSON.parse(‘json格式字符串‘)
eval(‘(‘ + json格式字符串 + ‘)‘)
安装:
pip install lxml
pip install jsonpath
http://blog.csdn.net/luxideyao/article/details/77802389
xpath和jsonpath的对比
/ $ 根元素
. @ 当前元素
/ . 子元素
// .. 任意位置查找
* * 通配符
[] ?() 过滤
xpath 索引下标从1开始
jsonpath 索引下标从0开始
以上是关于正则,bs4 ,xpath 和jsonpath 的匹配规则的主要内容,如果未能解决你的问题,请参考以下文章