我对这个正则表达式做错了什么

时间:2013-11-27 16:53:15

标签: python regex

links = re.findall('href="(http(s?)://[^"]+)"',page)

我有这个正则表达式来查找网站中的所有链接,我得到了这个结果:

('http://asecuritysite.com', '')
('https://www.sans.org/webcasts/archive/2013', 's')

当我想要的只是这个:

http://asecuritysite.com
https://www.sans.org/webcasts/archive/2013

如果我在href之后删除了"(它会给我带来大量错误,有人可以解释原因吗?

4 个答案:

答案 0 :(得分:2)

如果您使用多个捕获组,re.findall将返回元组列表而不是字符串列表。请尝试以下(仅使用单组):

>>> import re
>>> page = '''
...     <a href="http://asecuritysite.com">here</a>
...     <a href="https://www.sans.org/webcasts/archive/2013">there</a>
...     '''
>>> re.findall(r'href="(https?:\/\/[^"]+)"',page)
['http://asecuritysite.com', 'https://www.sans.org/webcasts/archive/2013']

根据re.findall documentation

  

如果模式中存在一个或多个组,则返回列表   组;如果模式有多个,那么这将是元组列表   基。

答案 1 :(得分:1)

尝试删除第二组(原始模式中的(s?)):

links = re.findall('href="(https?:\/\/[^"]+)"',page)

答案 2 :(得分:1)

你做错了是试图用Regex解析HTML。先生,这是一种罪。

See here for the horrors of Regex parsing HTML

另一种方法是使用lxml之类的东西来解析页面并提取类似这样的链接

urls = html.xpath('//a/@href')

答案 3 :(得分:0)

如果在https?之前是单引号而不是双引号,那么你也会遇到问题。

(https?:\/\/[^\"\'\>]+)将捕获整个字符串;你可以做的就是在它前面添加(href=.?),你最终得到两个捕获组:

完整正则表达式:(href=.?)(https?:\/\/[^\"\'\>]+)

MATCH 1

  • [第1组] href='
  • [第2组] http://asecuritysite.com

MATCH 2

  • [第1组] href='
  • [第2组] https://www.sans.org/webcasts/archive/2013

http://regex101.com/r/gO8vV7这是一个有效的例子