python中获取网页元素


一、方法概括

  1. xml/html文本: 正则表达式re、xpath
  2. json文件:jsonpath模块、正则表达式re

二、通用方法

使用所有方法获取页面元素都是需要先请求获取数据(爬虫),对返回数据进行分析,获取数据通过 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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐