我想用正则表达式从HTML页面中提取标题。目前我有这个:

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

是否有正则表达式来提取<title>的内容,这样我就不必删除标签了?


当前回答

Krzysztof krasosk目前投票最多的答案是<title>a</title><title>b</title>。此外,它忽略了跨越行边界的标题标签,例如,由于行长原因。最后,它失败于<title >a</title>(这是有效的XML/HTML标记中的空白)。

因此,我提出以下改进建议:

import re

def search_title(html):
    m = re.search(r"<title\s*>(.*?)</title\s*>", html, re.IGNORECASE | re.DOTALL)
    return m.group(1) if m else None

测试用例:

print(search_title("<title   >with spaces in tags</title >"))
print(search_title("<title\n>with newline in tags</title\n>"))
print(search_title("<title>first of two titles</title><title>second title</title>"))
print(search_title("<title>with newline\n in title</title\n>"))

输出:

with spaces in tags
with newline in tags
first of two titles
with newline
  in title

最后,我和其他人一起推荐一个HTML解析器——不仅要处理HTML标记的非标准使用。

其他回答

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

Try:

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

Krzysztof krasosk目前投票最多的答案是<title>a</title><title>b</title>。此外,它忽略了跨越行边界的标题标签,例如,由于行长原因。最后,它失败于<title >a</title>(这是有效的XML/HTML标记中的空白)。

因此,我提出以下改进建议:

import re

def search_title(html):
    m = re.search(r"<title\s*>(.*?)</title\s*>", html, re.IGNORECASE | re.DOTALL)
    return m.group(1) if m else None

测试用例:

print(search_title("<title   >with spaces in tags</title >"))
print(search_title("<title\n>with newline in tags</title\n>"))
print(search_title("<title>first of two titles</title><title>second title</title>"))
print(search_title("<title>with newline\n in title</title\n>"))

输出:

with spaces in tags
with newline in tags
first of two titles
with newline
  in title

最后,我和其他人一起推荐一个HTML解析器——不仅要处理HTML标记的非标准使用。

我认为这就足够了:

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

... 假设你的文本(HTML)在一个名为“text”的变量中。

这也假定没有其他HTML标记可以合法地嵌入到HTML TITLE标记中,并且没有任何其他<字符可以合法地嵌入到这样的容器/块中。

然而……

不要在Python中使用正则表达式进行HTML解析。使用HTML解析器!(除非您打算编写一个完整的解析器,当标准库中已经有各种HTML、SGML和XML解析器时,这将是一项额外的冗余工作)。

如果您正在处理“真实世界”的标记soup HTML(通常不符合任何SGML/XML验证器),那么请使用BeautifulSoup包。它不在标准库中(目前),但被广泛推荐用于此目的。

另一个选项是:lxml…它是为结构合理(符合标准)的HTML编写的。但是它有一个选项可以退一步使用BeautifulSoup作为解析器:ElementSoup。

我可以向您推荐美丽汤吗?Soup是一个解析所有html文档的很好的库。

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