抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

一. 背景

在公司的erp系统中,还有很多jsp写的页面没有做前后端分离,一些重要信息没有写入到cookie,也不是通过接口返回,直接嵌入在页面中,例如 token字段。

image-20210510161422276

一开始以为可能在cookie里,发现找不到,咨询开发,得知是后台返回的,那什么时候返回 ?返回到哪去了?

逐步排查,发现该字段是在点击新建工单后,通过返回的页面带出来的。

image-20210510161301084

直接返回一个html,是doc类型

image-20210510161403267

二. 使用beautifulsoup进行解析

1. 什么是beautifulsoup

beautifulSoup,一个灵活又方便的网页解析库,处理高效,支持多种解析器。

不同解码器适用不同场景,各有优缺点,如下:

image.png

一般使用较多的就是lxml来解析html。

2. 安装beautifulsoup

beautifulsoup需要单独安装(这里安装命是他的缩写: bs4)

1
pip install bs4

3. 使用beautifulsoup

页面源代码如下(部分)

image.png

1
2
3
4
5
6
7
8
9
10
11
12
from bs4 import BeautifulSoup       #  引入BeautifulSoup

response = "" # 此处省略,这边访问url接口后返回的值

# 在当前测试框架下,res.json失败则返回res.content,此处返回的content经验证是bytes类型
# 所以先把bytes转换成str
res = str(response, encoding="utf-8") # encoding根据页面实际来

html = BeautifulSoup(res, 'lxml') # 这里使用lxml解析器解析页面

# 解析完后,可以使用类似于selenium的方式来获取节点,以及节点的属性。
print(html.select('input[id="token"]')[0]['value'])

如图,input的id为token,而我们要取他的一个属性–value,因此。在使用beautifulsoup解析后,就可以访问其中的任何节点,使用方式有点像selenium。

这边用的select,返回的是一个列表,当然,id唯一,固定取第一个,下标传0,这样就取到了这个input,然后获取他的value的值。

三. 拓展

上文示例,只是获取节点的一种方式,还有多种方式可以来实现。

感兴趣可以自行看文档,推荐文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/index.html

四. 使用re模块正则匹配取值

RegexTester下载

有些老页面,例如业务分类

image-20210510161611687

这些不是接口返回,是随着页面直接返回的,但是这种太多了,通过html解析器再去找也挺麻烦的。

那么这些信息是后台直接渲染好的么?从源码中找找。

随便找个分类“维修”查找下

image-20210510161707604

发现,原来这些信息通过script渲染的,幸运的是,我们能直接从源码中获取,而不必通过Ajax动态获取。

OK,到这里,就明了,内容都给你了,直接正则匹配获取吧。

先写表达式

image-20210510161832425

OK,都匹配出来了。

使用re模块进行正则匹配,这里需要匹配多项,使用finall。

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-

html = """
<script>
var businessLabels = [{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"维修"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"保养"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"美容"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"钣喷"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"轮胎"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"洗车"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"精品"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":0,"isLocal":0,"name":"其他"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":0,"name":"零售"},{"id":1111111,"idOwnOrg":"22222222222222222","isDel":0,"isEnable":1,"isLocal":1,"name":"清洁"}] || {};
</script>"""

import re
pattern = re.compile(r'"id":(.*?),"idOwnOrg":"(.*?)","isDel":(.*?),"isEnable":(.*?),"isLocal":(.*?),"name":"(.*?)"')
match_results = re.findall(pattern, html)
for i in match_results:
print(i)

结果

image-20210510162051789

结果取出来之后,再自行加工吧~

评论