如何匹配python正则表达式中的所有链接?

时间:2014-02-26 13:06:41

标签: python regex regular-language

我正在尝试创建一个与页面源链接匹配的正则表达式。我的文字格式如下:

这里的东西 这是一个链接

<a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a><span class="mls _1ccm9 _49"></span><a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a><span class="m1ls _1cm9 _49"></span>

我想获得所有以href =“https://www.here.com/(.*)?ref=br_rs”&gt;

开头的链接

所以从链接来看,我会得到整个链接,或者FIrstCal和Mall(来自链接)

Python代码:

regex = r'(?<=href="https://www.here.com/).*(?<=?ref=br_rs)'

link = re.findall(regex, str(source))

link

但它不起作用。

有什么想法吗?

PS:正则表达式是唯一的方法。 HTML解析不起作用,因为网站的结构并不“稳定”。

1 个答案:

答案 0 :(得分:3)

将BeautifulSoup与仅与href内容匹配的正则表达式使用:

soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs'))

解析器不关心结构是否正在发生变化,您只需要准确了解 的稳定性;链接。

演示:

>>> import re
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('''\
... <a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a><span class="mls _1ccm9 _49"></span><a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a><span class="m1ls _1cm9 _49"></span>
... ''')
>>> soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs'))
[<a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a>, <a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a>]