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之后删除了"(
它会给我带来大量错误,有人可以解释原因吗?
答案 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']
如果模式中存在一个或多个组,则返回列表 组;如果模式有多个,那么这将是元组列表 基。强>
答案 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
href='
http://asecuritysite.com
MATCH 2
href='
https://www.sans.org/webcasts/archive/2013
http://regex101.com/r/gO8vV7这是一个有效的例子