Python Regex - 在html标签之间查找字符串[重复]

Posted

技术标签:

【中文标题】Python Regex - 在html标签之间查找字符串[重复]【英文标题】:Python Regex - find string between html tags [duplicate] 【发布时间】:2016-01-12 06:16:26 【问题描述】:

我正在尝试提取 html 标签之间的字符串。我可以看到以前在堆栈溢出方面也有人问过类似的问题,但我对 python 完全陌生,而且我很挣扎。

如果我有

<b>Bold Stuff</b>

我想要一个正则表达式,让我留下来

Bold Stuff

但到目前为止,我的所有解决方案都给我留下了类似

>Bold Stuff<

非常感谢您对此提供任何帮助。

我有

>.*?<

我看到了一个关于堆栈溢出的问题,并提出了解决方案

>([^<>]*)<

但这些都不适合我。请有人解释一下如何编写一个正则表达式,上面写着“找到字符 x 和 y 之间的字符串,不包括 x 和 y”。

感谢您的帮助

【问题讨论】:

&gt;([^&lt;&gt;]*)&lt; 这个和re.findall 应该可以工作 【参考方案1】:
>>> a = '<b>Bold Stuff</b>'
>>> 
>>> import re
>>> re.findall(r'>(.+?)<', a)
['Bold Stuff']
>>> re.findall(r'>(.*?)<', a)[0] # non-greedy mode
'Bold Stuff'
>>> re.findall(r'>(.+?)<', a)[0] # or this, also is non-greedy mode
'Bold Stuff'
>>> re.findall(r'>(.*)<', a)[0] # greedy mode
'Bold Stuff'
>>> 

此时贪婪模式和非贪婪模式都可以工作。

您正在使用第一种非贪婪模式。下面是一个关于非贪婪模式和贪婪模式的例子:

>>> a = '<b>Bold <br> Stuff</b>'
>>> re.findall(r'>(.*?)<', a)[0]
'Bold '
>>> re.findall(r'>(.*)<', a)[0]
'Bold <br> Stuff'
>>> 

这里是关于(...)

(...)

匹配括号内的任何正则表达式,并指示组的开始和结束;

可以在执行匹配后检索组的内容,并且可以稍后在字符串中使用 \number 特殊序列进行匹配,如下所述。

要匹配文字 (),请使用 \(\),或将它们包含在字符类中:[(] [)]

【讨论】:

【参考方案2】:

删除 HTML 标签可能更简单,留下内容:

>>> import re
>>> re.sub('<[^<>]+>', '', '<b>Bold Stuff</b>')
'Bold Stuff'
>>> 

请注意,与使用适当的 HTML 解析器相比,使用正则表达式删除 HTML 标记通常被认为是不好的做法,但如果您知道自己的内容并且可以依赖它,这可能没问题。

【讨论】:

【参考方案3】:

我猜您的问题与从re.search 返回的MatchObject 有关。在这种情况下,可以通过group() 函数访问匹配项。但是,第一组是整个匹配项,但您想获得带括号的子组。

text = '<b>Bold Stuff</b>'

m = re.search('>([^<>]*)<', text)
print (m.group(0)) # the whole match: >Bold Stuff<
print (m.group())  # the same as with the zero argument
print (m.group(1)) # the first parenthesized subgroup: Bold Stuff

它可能适用于一些简单的情况。然而,在更复杂的情况下,处理标签重叠可能会很棘手,例如参见RegEx match open tags except XHTML self-contained tags:

您无法使用正则表达式解析 [X]HTML。因为 HTML 无法解析 正则表达式。正则表达式不是一个可以用来正确解析 HTML 的工具……

【讨论】:

【参考方案4】:
from bs4 import BeautifulSoup

page = requests.get(url)
soup = BeautifulSoup(page.content,'html.parser')
title = soup.find('b').text

【讨论】:

以上是关于Python Regex - 在html标签之间查找字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 和 Regex,如何从 html 中删除 <sup> 标签? [复制]

Python regex look-behind 需要固定宽度的模式

Regex / Python3 - re.findall() - 查找操作码之间的所有匹配项

使用 PHP Regex 或 DOM,如何在标签之间使用 eol 或换行符获取网页的 <TITLE>?</TITLE>?

PHP/regex:如何获取 HTML 标签的字符串值?

Python Regex:如何在两个模式之间选择行