作者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)