编写Python正则表达式以选择HTML列表项的子集
我有一个网页,可以查看一个文件夹里的内容...
<ul><li><a href="/sustainabilitymedia/pics/s5/"> Parent Directory</a></li>
<li><a href="n150850_.jpg"> n150850_.jpg</a></li>
<li><a href="n150850_ss.jpg"> n150850_ss.jpg</a></li>
<li><a href="n150850q.jpg"> n150850q.jpg</a></li>
<li><a href="n150858_.jpg"> n150858_.jpg</a></li>
<li><a href="n150858_ss.jpg"> n150858_ss.jpg</a></li>
<li><a href="n150858q.jpg"> n150858q.jpg</a></li>
<li><a href="n150906_.jpg"> n150906_.jpg</a></li>
<li><a href="n150906_ss.jpg"> n150906_ss.jpg</a></li>
...
这个列表非常长。我想要做的是,只提取那些以 _ss.jpg
结尾的列表项,这样我就可以把结果整理出来,漂亮地展示在页面上。
我可以用 BeautifulSoup 抓取这个页面,但接下来我不太确定怎么筛选出只符合特定模式的列表项。这个页面需要基本认证,我之前已经解决过这个问题,关于 BeautifulSoup 的使用。我也可以选择不使用它。
有没有什么好主意呢?
3 个回答
0
我会使用类似下面的代码:
data = data.split("\n")
data = filter(x : x.find("_ss.jpg") >= 0,data)
data = map(lambda x: re.match("(?<=<href=)\".*_ss\.jpg\"(?=>)",x),data)
这样做应该能得到一个以 _ss.jpg 结尾的名字列表。
1
布伦特说得完全正确;给他点赞,因为他反应真快。
我已经准备了一个例子,所以我想还是发上来吧(没必要投票了):
>>> from BeautifulSoup import BeautifulSoup as bs
>>> from pprint import pprint
>>> import re
>>> markup = '''
... <ul><li><a href="/sustainabilitymedia/pics/s5/"> Parent Directory</a></li>
... <li><a href="n150850_.jpg"> n150850_.jpg</a></li>
... <li><a href="n150850_ss.jpg"> n150850_ss.jpg</a></li>
... <li><a href="n150850q.jpg"> n150850q.jpg</a></li>
... <li><a href="n150858_.jpg"> n150858_.jpg</a></li>
... <li><a href="n150858_ss.jpg"> n150858_ss.jpg</a></li>
... <li><a href="n150858q.jpg"> n150858q.jpg</a></li>
... <li><a href="n150906_.jpg"> n150906_.jpg</a></li>
... <li><a href="n150906_ss.jpg"> n150906_ss.jpg</a></li>'''
>>> soup = bs(markup)
>>> pprint(soup.findAll(href=re.compile('_ss[.]jpg$')))
[<a href="n150850_ss.jpg"> n150850_ss.jpg</a>,
<a href="n150858_ss.jpg"> n150858_ss.jpg</a>,
<a href="n150906_ss.jpg"> n150906_ss.jpg</a>]
祝庆祝感恩节的人们节日快乐。
6
你可以使用正则表达式来进行查找,比如这样写:soup_object.findAll('a', {'href': re.compile('.*_ss\.jpg')})
。