编写Python正则表达式以选择HTML列表项的子集

1 投票
3 回答
706 浏览
提问于 2025-04-16 07:34

我有一个网页,可以查看一个文件夹里的内容...

<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')})

撰写回答