提取正则表达式匹配项的一部分


130

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

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

是否有一个正则表达式仅提取<title>的内容,所以我不必删除标签?


5
哇,我简直不敢相信所有调用解析整个HTML页面的响应只是为了提取一个简单的标题。太夸张了!
hoju

4
问题标题说明了一切-给出的示例恰好是HTML,但是一般的问题是...一般。
菲尔(Phil)

Answers:


207

( )在正则表达式和group(1)python中检索捕获的字符串(re.search将返回None如果没有找到结果,所以不要用group()直接):

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

if title_search:
    title = title_search.group(1)

1
如果在找不到标题的情况下什么也不做,为什么直接使用group()会是一件坏事?(无论如何您都可以捕获到异常)
tonfa

1
是的,但是大多数人都忘记了异常,并且在运行时看到异常时真的感到惊讶:)
KrzysztofKrasoń09年

别忘了跑步import re,否则您会得到NameError: name 're' is not defined
Powers

16

请注意,通过开始Python 3.8并引入赋值表达式(PEP 572):=运算符),可以通过在if条件中直接将匹配结果捕获为变量并将其在条件体内重复使用,从而对KrzysztofKrasoń解决方案进行一些改进:

# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
  title = match.group(1)
# hello



4

我可以推荐你去美丽汤。汤是一个很好的库,可以解析您的所有html文档。

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

我想补充一下,beautifulsoup还可以解析不完整的html,这真的很好。
13年

3

尝试:

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

如果您确实想使用REGEX进行HTML解析,请不要在匹配项上直接运行.group(),因为它可能返回None。
iElectric

如果文档中.*?有多个</title>(不太可能,但您永远不知道),则应使用此方法。
09年

@iElectric:如果您真的想要的话,可以尝试将其试一下,除了块,对吗?
09年

3

提供的代码段不能应付Exceptions 我的建议

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

如果未找到模式或第一个匹配项,则默认情况下返回空字符串。


1

我认为这足够了:

#!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解析器时,这将是一项额外的工作。

如果您处理“真实世界” 标记汤 HTML(通常不符合任何SGML / XML验证器),请使用BeautifulSoup包。它尚未出现在标准库中,但为此目的广泛建议使用。

另一个选项是:lxml ...,它是为结构正确(符合标准的HTML)编写的。但是它可以选择退回到使用BeautifulSoup作为解析器:ElementSoup

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.