不用正则表达式,如何提取html中的关键信息

作者qq:64761294
python交流群:818757567
欢迎交流

题目

在这里插入图片描述

今天一个朋友问了一道题,由于这位朋友尚未学到正则表达式,所以我就来研究一下如何在不适用正则表达式的条件下,完成题目需求。

1、首先分析题目html代码,简化问题

在这个问题中,我们可以清楚的认识到,题目需要我们得出这样一个结果:

[['白云山', '600332'], ['美克家居', '600337'], ['老白干酒', '600559']]

在这三行代码中,我们需要的关键信息是一串汉字,和包含于括号内的一串代号。
为了让问题变简单,我们先用一下split方法,将代码按">"符号分隔开
这一步完成之后,我们将得到一个这样的列表

['<li', '<a target="_blank" href="http://quote.eastmoney.com/sh600337.html"', 
'白云山(600332)</ a', '</li', '\n\n<li', '<a target="_blank" href="http://quote.eastmoney.com/sh600337.html"', 
'美克家居(600337)</ a', '</li', '\n\n<li', '<a target="_blank" href="http://quote.eastmoney.com/sh600559.html"', 
'老白干酒(600559)</ a', '</li', '']

2、分析简化后的问题

经过上一步之后,我们得到一个列表a,现在问题就转化为:
第一步:先提取出列表中含有汉字和股票代号的元素
第二步:把提取出的元素经过一些处理,转化为我们最终所要的结果

2.1 提取列表a中的特定元素

通过观察,我们可以发现,在我们想要的那一些元素中,含有其它元素所没有的,也就是一对圆括号()所以,我们就可以利用这个不同点,使用存在性判断语句 ‘A’ in ‘B’(如果B中存在A,返回True,否则返回False)

代码如下:

for e in a:
	if "(" and ")" in e:
		ls.append(e)

从代码中,我们可以看到,我们引入了一个新列表ls,ls初始状态是一个空列表,用于存放我们从列表a中提取出的特定元素。

这时候输出一下列表ls可以看到以下结果:

['白云山(600332)</ a', '美克家居(600337)</ a', '老白干酒(600559)</ a']
2.2将ls中的元素进一步处理得到结果

对比我们最终想要的结果
在这里插入图片描述
我们可以发现,ls列表和结果列表相比,每一份个元素都多了一对圆括号(),以及一串’</ a’,并且没有将汉字和数字分开。

第一步:分割数字和汉字
第二步:去除多余字符

2.2.1 分割汉字和数字

观察发现,汉字和数字中间存在一个 ‘(’ 所以我们可以采用split方法,将汉字和数字部分以’('为界限分开。
代码:

for i in ls:
	i=i.split("(")

输出一下 i
在这里插入图片描述

2.2.2 去除数字项中的多余字符串

我们知道,字符串有一个strip函数可以对字符串首尾的指定字符进行删除
只需要在上一步的循环体中加入这样一条语句

for i in ls:
	i=i.split('(')
	i[1]=i[1].strip(')</ a')

我们看一下输出结果
在这里插入图片描述

3、下面进行最后一步-生成二维列表rs

首先在程序头部创建一个空列表rs

然后使用append方法将上一步循环中的i依次加入rs

for i in ls:
	i=i.split('(')
	i[1]=i[1].strip(')</ a')
	rs.append(i)

看看最后结果,已经和需求一模一样了,大功告成!
在这里插入图片描述

4、完整代码:

s='''<li><a target="_blank" href="http://quote.eastmoney.com/sh600337.html">白云山(600332)</ a></li>

<li><a target="_blank" href="http://quote.eastmoney.com/sh600337.html">美克家居(600337)</ a></li>

<li><a target="_blank" href="http://quote.eastmoney.com/sh600559.html">老白干酒(600559)</ a></li>'''
ls=[]
rs=[]
a=s.split('>')
#遍历a列表 提取同时含有(和)的元素
for e in a:
	if "(" and ")" in e:
		ls.append(e)
#去掉列表元素中的杂项,分隔汉字和数字
for i in ls:

	i=i.split('(')
	i[1]=i[1].strip(')</ a')
	print(i)
	rs.append(i)
print(rs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值