python爬虫之JS逆向——网页数据解析

目录

一、正则

1 正则基础

元字符

基本使用

通配符: '.'

字符集: '[]'

重复

位置

管道符和括号

转义符

转义功能

转义元字符

2 正则进阶

元字符组合(常用)

模式修正符

 re模块的方法

有名分组

compile编译

二、bs4

1 四种对象

2 导航文档树

嵌套选择

子节点、子孙节点

父节点、祖先节点

兄弟节点

3 搜索文档树

name参数

  标签名

  正则表达式

  列表

  函数(精致过滤)

关键字参数

文本参数

4 CSS选择器

三、xpath

1 路径表达式

2 谓语

3 通配符

4 其他用法

5 文件操作

文件句柄

读操作

写操作 

覆盖写

追加写


一、正则

是描述一段文本排列规则的表达式
正则表达式并不是python的一部分,而是一套独立于编程语言,用于处理复杂文本信息的强大的高级文本操作工具。
python提供re模块或regex模块来调用正则处理引擎

正则对字符串的操作:分割、匹配、查找和替换

1 正则基础

元字符

元字符是具有特殊含义的字符

元字符 描述
[] 匹配一个中括号中出现的任意一个原子
[^原子] 匹配一个没有在中括号中出现的任意原子
\ 转义字符,可以把原子转换特殊元字符,也可以把特殊元字符转换成原子
^ 叫开始边界符或开始锚点符,匹配一行的开头位置
$ 叫结束边界符或开始锚点符,匹配一行的结束位置
. 叫通配符、万能通配符或通配元字符,匹配一个除了换行符\n以外任何原子
* 叫星号贪婪符,指定左边原子出现0次或多次
? 叫非贪婪符,指定左边原子出现0次或1次
+ 叫加号贪婪符,指定左边原子出现1次或多次
{n,m}

叫数量范围贪婪符,指定左边原子的数量范围,有{n},{n,},{,m},{n,m}四种写法,

其中n与m必须是非负整数

| 指定原子或正则模式进行二选一或多选一
() 对原子或正则模式进行捕获提取和分组划分整体操作

举例和一些特殊组合如下所示

基本使用
import re

ret1 = re.findall("a", "a,b,c,d,e")  # ['a']
通配符: '.'
ret2 = re.findall(".", "a,b,c,d,e")  # ['a', ',', 'b', ',', 'c', ',', 'd', ',', 'e']
ret2 = re.findall("a.b", "a,b,c,d,e,acb,abb,a\nb,a\tb")  # ['a,b', 'acb', 'abb', 'a\tb']
字符集: '[]'
ret3 = re.findall("[ace]", "a,b,c,d,e")  # ['a', 'c', 'e']
ret3 = re.findall("a[bce]f", "af,abf,abbf,acef,aef")  # ['abf', 'aef']
ret3 = re.findall("[a-zA-Z]", "a,b,c,d,e,A,V")  # ['a', 'b', 'c', 'd', 'e', 'A', 'V']
ret3 = re.findall("[a-zA-Z0-9]", "a,b,c,d,1,e,A,V")  # ['a', 'b', 'c', 'd', '1', 'e', 'A', 'V']
ret3 = re.findall("[^0-9]", "a,2,b,c,d,1,e,A,V")  # ['a', ',', ',', 'b', ',', 'c', ',', 'd', ',', ',', 'e', ',', 'A', ',', 'V']
# [0-9] == \d [a-zA-Z0-9] == \w
重复

'*' :1-多次

'+' :0-多次

'?' :0/1次, 也可取消贪婪匹配

'{m,n}' :m-n次

贪婪匹配,每次为最多次匹配

?取消贪婪匹配

ret4 = re.findall("\d+", "a,b,234,d,6,888")  # ['234', '6', '888']
# ?取消贪婪匹配
ret4 = re.findall("\d+?", "a,b,234,d,6,888")  # ['2', '3', '4', '6', '8', '8', '8']

+

ret4 = re.findall("\w", "apple,banana,orange,melon")  # ['a', 'p', 'p', 'l', 'e', 'b', 'a', 'n', 'a', 'n', 'a', 'o', 'r', 'a', 'n', 'g', 'e', 'm', 'e', 'l', 'o', 'n']
ret4 = re.findall("\w+", "apple,banana,orange,melon")  # ['apple', 'banana', 'orange', 'melon']
ret4 = re.findall("\w+?", "apple,banana,orange,melon")  # ['a', 'p', 'p', 'l', 'e', 'b', 'a', 'n', 'a', 'n', 'a', 'o', 'r', 'a', 'n', 'g', 'e', 'm', 'e', 'l', 'o', 'n']

 注:"\w*" == ""和"\w"

*

ret4 = re.findall("\w*", "apple,banana,orange,melon")  # ['apple', '', 'banana', '', 'orange', '', 'melon', '']
ret4 = re.findall("abc*", "abc,abcc,abe,ab")  # ['abc', 'abcc', 'ab', 'ab']

?

ret4 = re.findall("\w{6}", "apple,banana,orange,melon")  # ['banana', 'orange']

{m,n}

ret4 = re.findall("abc?", "abc,abcc,abe,ab")  # ['abc', 'abc', 'ab', 'ab']
ret4 = re.findall("abc??", "abc,abcc,abe,ab")  # ['ab', 'ab', 'ab', 'ab']
位置

'^' :匹配开头符合条件的字符

'$' :匹配结尾符合条件的字符

^

ret5 = re.findall("^\d+", "34,banana,255,orange,5434")  # ['34']
ret5 = re.findall("^\d+", "peath,34,banana,255,orange,5434")  # []

$

ret5 = re.findall("\d+$", "34,banana,255,orange,5434")  # ['5434']
ret5 = re.findall("\d+$", "peath,34,banana,255,orange")  # []
管道符和括号

|:或

():优先提取/括号

(?:) 取消模式捕获

ret6 = re.findall(",(\w{5}),", ",apple,banana,peach,orange,melon,")  # ['apple', 'peach', 'melon']
ret6 = re.findall("\w+@(163|qq)\.com", "[email protected]@qq.com")  # ['163', 'qq']
ret6 = re.findall("\w+@(?:163|qq
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值