我想用正则表达式从HTML页面中提取标题。目前我有这个:
title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
title = title.replace('<title>', '').replace('</title>', '')
是否有正则表达式来提取<title>的内容,这样我就不必删除标签了?
我想用正则表达式从HTML页面中提取标题。目前我有这个:
title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
title = title.replace('<title>', '').replace('</title>', '')
是否有正则表达式来提取<title>的内容,这样我就不必删除标签了?
当前回答
我可以向您推荐美丽汤吗?Soup是一个解析所有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”的变量中。
这也假定没有其他HTML标记可以合法地嵌入到HTML TITLE标记中,并且没有任何其他<字符可以合法地嵌入到这样的容器/块中。
然而……
不要在Python中使用正则表达式进行HTML解析。使用HTML解析器!(除非您打算编写一个完整的解析器,当标准库中已经有各种HTML、SGML和XML解析器时,这将是一项额外的冗余工作)。
如果您正在处理“真实世界”的标记soup HTML(通常不符合任何SGML/XML验证器),那么请使用BeautifulSoup包。它不在标准库中(目前),但被广泛推荐用于此目的。
另一个选项是:lxml…它是为结构合理(符合标准)的HTML编写的。但是它有一个选项可以退一步使用BeautifulSoup作为解析器:ElementSoup。
在regexp中使用(),在python中使用group(1)来检索捕获的字符串(re.search如果没有找到结果将返回None,所以不要直接使用group()):
title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE)
if title_search:
title = title_search.group(1)
我需要一些东西来匹配package-0.0.1(名称,版本),但想拒绝一个无效的版本,如0.0.010。
参见regex101示例。
import re
RE_IDENTIFIER = re.compile(r'^([a-z]+)-((?:(?:0|[1-9](?:[0-9]+)?)\.){2}(?:0|[1-9](?:[0-9]+)?))$')
example = 'hello-0.0.1'
if match := RE_IDENTIFIER.search(example):
name, version = match.groups()
print(f'Name: {name}')
print(f'Version: {version}')
else:
raise ValueError(f'Invalid identifier {example}')
输出:
Name: hello
Version: 0.0.1
没有人建议使用前视和后视,有什么特别的原因吗?我在这里试图做完全相同的事情和(?<=<title>).+(?=<\/title>)工作得很好。它只会匹配括号之间的内容所以你不需要做整个组的事情。
所提供的代码段不能处理异常 我可以建议
getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]
默认情况下,如果没有找到模式或第一个匹配,则返回空字符串。