这是我的代码:
a='<title>aaa</title><title>aaa2</title><title>aaa3</title>'
import re
re.findall(r'<(title)>(.*)<(/title)>', a)
结果是:
[('title', 'aaa</title><title>aaa2</title><title>aaa3', '/title')]
如果我设计了一个抓取工具来获取网站标题,我可能会得到类似这样的东西,而不是网站的标题。
我的问题是,如何将findall
限制为单个<title></title>
?
答案 0 :(得分:13)
如果您只想要一场比赛,请使用re.search
代替re.findall
:
>>> s = '<title>aaa</title><title>aaa2</title><title>aaa3</title>'
>>> import re
>>> re.search('<title>(.*?)</title>', s).group(1)
'aaa'
如果您想要所有标签,那么您应该考虑将其更改为非贪婪(即 - .*?
):
print re.findall(r'<title>(.*?)</title>', s)
# ['aaa', 'aaa2', 'aaa3']
但实际上考虑使用BeautifulSoup或lxml或类似方法来解析HTML。
答案 1 :(得分:5)
改为使用非贪婪的搜索:
r'<(title)>(.*?)<(/title)>'
问号表示匹配尽可能少的字符。现在你的findall()将返回你想要的每个结果。
http://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy
答案 2 :(得分:2)
re.findall(r'<(title)>(.*?)<(/title)>', a)
在?
之后添加*
,这样就不会贪婪。
答案 3 :(得分:1)
使用BeautifulSoup模块会更容易。