8

这是我的代码:

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为 single <title></title>

4

4 回答 4

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。

于 2013-07-20T19:16:56.867 回答
5

改用非贪婪搜索:

r'<(title)>(.*?)<(/title)>'

问号表示匹配尽可能少的字符。现在您的 findall() 将返回您想要的每个结果。

http://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy

于 2013-07-20T19:21:59.373 回答
2
re.findall(r'<(title)>(.*?)<(/title)>', a)

?在之后添加一个*,所以它是非贪婪的。

于 2013-07-20T19:16:32.270 回答
1

使用 BeautifulSoup 模块会容易得多。

https://pypi.python.org/pypi/beautifulsoup4

于 2014-05-21T08:55:03.810 回答