提取正则expression式匹配的一部分

我想要一个正则expression式从HTML页面中提取标题。 目前我有这个:

title = re.search('<title>.*</title>', html, re.IGNORECASE).group() if title: title = title.replace('<title>', '').replace('</title>', '') 

是否有一个正则expression式只提取内容,所以我不必删除标签?

谢谢!

用正则expression式中的( )和python中的group(1)来检索捕获的string(如果没有find结果, re.search将返回None ,所以不要直接使用group() ):

 title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE) if title_search: title = title_search.group(1) 

请不要使用正则expression式来parsing标记语言。 使用lxml或beautifulsoup。

尝试使用捕获组:

 title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) 

尝试:

 title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) 

re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)

使用正则expression式来parsingHTML通常不是一个好主意。 你可以使用像美丽的汤任何HTML分析器。 看看http://www.crummy.com/software/BeautifulSoup/documentation.html

还要记住, 有些人遇到问题时,会想:“我知道,我会用正则expression式”。 现在他们有两个问题。

提供的代码段不能应付Exceptions我可以build议

 getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0] 

如果没有find模式,或者第一个匹配,默认返回一个空string。

我可以向你推荐美丽的汤。 汤是一个非常好的lib来parsing所有的html文档。

 soup = BeatifulSoup(html_doc) titleName = soup.title.name 

我认为这应该足够了:

 #!python import re pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE) pattern.search(text) 

假设你的文本(HTML)是在一个名为“text”的variables中。

这也假设没有其他HTML标签可以合法地embedded到HTML TITLE标签中,也没有办法在这样的容器/块中合法地embedded任何其他的<字符。

不过

不要在Python中使用正则expression式进行HTMLparsing。 使用HTMLparsing器! (除非你要编写一个完整的parsing器,当各种HTML,SGML和XMLparsing器已经在标准库中时,这将是一个额外的工作。

如果您处理“真实世界” 标签汤 HTML(这是经常不符合任何SGML / XMLvalidation程序),然后使用BeautifulSoup包。 它不在标准库(尚)中,但为此目的被广泛推荐。

另一种select是: lxml …这是为正确的结构(符合标准的)HTML编写的。 但是它有一个选项可以使用BeautifulSoup作为parsing器: ElementSoup 。