python中获取网页元素
python中获取网页元素一、方法概括xml/html文本: 正则表达式re、xpathjson文件:jsonpath模块、正则表达式re二、通用方法使用所有方法获取页面元素都是需要先请求获取数据(爬虫),对返回数据进行分析,获取数据通过 request.get/post ( … ) 方法,并接收返回数据。语法:response = request(url, headers=headers, pr
python中获取网页元素
一、方法概括
二、通用方法
使用所有方法获取页面元素都是需要先请求获取数据(爬虫),对返回数据进行分析,获取数据通过 request.get/post ( … ) 方法,并接收返回数据。
-
语法:
response = request(url, headers=headers, proxies=proxies, ...)
-
其中 response 是用来接收返回值的变量
-
url 为需要请求页面的地址
-
headers 是发送请求的请求头,一般必须添加 ‘user_agent’ 元素,其他选加
-
proxies 是使用网络代理来避免反爬,一般有 http/https/socks ,其中socks既可以使用 http 也可以使用 https
-
三、使用正则表达式re获取元素
1、获取 xml/html 或 json 文本 :
re正则表达式获取xml 或 json 文本时都需要使用 resuest 发送请求并接收数据
然后用正则语法进行数据分析提取
2、re语法
1、re.match( ‘re语句’, str, flags=0 ) :
re.match 代表使用的re语句必须在字符串开头就匹配成功,否则就匹配失败;
匹配成功返回匹配对象(element),失败则返回None。
2、re.search( ‘re语句’, str, flags=0 ) :
re.search 代表使用的re语句在整个字符串中匹配,匹配的到就匹配成功,否则就匹配失败;
匹配成功返回匹配对象(element),失败则返回None。
3、re.findall( ‘re语句’, str, flags=0 ) :
re.search 代表使用的re语句在整个字符串中匹配,返回匹配成功的所有子串
匹配成功返回list(…),失败则返回 空list。
4、re.split( ‘re语句’, str, maxsplit=0, flags=0 ) :字符串分割
re.split 功能:根据正则表达式匹配的子串对原字符串进行分割,返回分割后的列表
maxsplit :分割次数
5、正则表达式分组语法 :
(正则表达式) :将括号中的字符作为一个分组
(?P正则表达式) :name 为括号中分组的别名
分组的引用 :
/num :num表示第几个分组,默认从1开始:1,2,3 …
6、re.sub( ‘正则表达式’, repl, str, count=0, flags=0 ) : 字符串替换
repl :替换的字符串
str :被替换的原始字符串
count :替换的最大次数,默认为0代表全部替换
7、正则表达式修饰符 flags :
默认为 flags = 0 代表无修饰
flags = re.I :匹配时不区分大小写
flags = re.M :多行匹配,影响 ^ 和 $
flags = re.S :使 . 在匹配时匹配包括换行符在内的所有字符
3、使用步骤
说明:使用re时要先导入re模块;然后使用需要的方法获取数据;
注意:re 只作用于解码后 的字符串str
import re
response = request(url, headers=headers) -- 请求数据
res = response.content.decode() -- 对原数据转码
need_data = re.search(r're语句', res) -- 使用re获取数据
四、使用xpath获取元素
1、获取 xml/html 数据
xpath只能获取 xml/html 上的元素。使用步骤:①.在获取前需要通过 request 先获取页面数据;②.然后使用etree.HTML( )方法把字符串数据转成Element对象;③.再使用xpath语法筛选Element对象。
只有Element对象才可以使用 element.xpath(‘xpath字符串’) 获取数据
2、xpath语法
1、XML的每个标签称为节点,使用xpath进行选择时要从根节点开始遍历
2、查找节点:
路径表达式 | 结果 |
---|---|
//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’] | 选择所有book下的title元素,仅选择文本为Harry Potter的title元素 |
/bookstore/book[price>35.00]/title | 选择bookstore元素中book元素的所有title元素,且其中的price元素的值须大于35 |
3、在xpath中,第一个元素的位置是1,最后一个元素的位置是 last( ),倒数第二个是last( ) - 1
3、使用步骤
说明:在python中使用xpath语法前,需要使用lxml中的 etree.HTML() 方法把请求获取的str类型的网页数据转换为Element对象类型,该对象类型可以使用自带的 .path( ) 方法获取相应数据
①、导入 etree 方法 : from lxml import etree
②、获取数据:
注意:获取的原数据是bytes型,必须要先进行转码再转换
from lxml import etree
response = request(url, headers=headers) -- 请求数据
res = response.content.decode() -- 对原数据转码
html = etree.HTML(res) -- 把str转为element对象
need_data_list = html.xpath('xpath语法') -- 使用 xpath语法获取数据
4、注意点
只要使用xpath语法得到的数据不是准确的内容,则返回的数据都是element对象;可以重复使用xpath直到获取准确的数据;只要是通过xpath方法得到的数据都是字符串str型的列表list。
五、使用jsonpath模块获取元素
1、获取json数据
json数据格式:json的一般数据格式是字典套字典
例: my_dict = {“key1”: {“key2”: {“key3”: ‘一条数据’}}}
使用jsonpath方法可以更简单地获取需要的json数据
2、jsonpath语法
JSONPath | 描述 |
---|---|
$ | 表示根元素 |
@ | 当前元素 |
. or [] | 子元素 |
… | 不管位置,选择符合条件的元素 |
* | 匹配所有元素节点 |
[] | 迭代器标示,可以在里面做简单的迭代操作,如数组下标、根据内容选值等。 |
[,] | 支持迭代器做多选 |
?() | 支持过滤操作 |
() | 支持表达式计算 |
3、使用步骤
①.首先需要在python中导入jsonpath模块;
②.然后通过 request 获取 json 数据并接收;
③.接收的变量中有个方法可以转换接收数据为dict格式(原本json中的数据就是字典套字典的格式);
④.使用 jsonpath.jsonpath( ) 方法使用jsonpath语法获取需要的数据,且返回的数据格式为list
具体使用:
import jsonpath
import json
response = request(url, headers=headers) -- 请求数据
res = response.json() -- 获取json数据 类型为 dict
need_data_list = jsonpath.jsonpath(res, 'jsonpath语法') -- 获取符合要求的数据,数据类型为list
更多推荐
所有评论(0)