Python正则表达式 - 查找HTML标签之间的字符串

5
我正在尝试提取Html标签之间的字符串。我看到类似的问题以前在stackoverflow上被问过,但我完全是python的新手,我很困难。
所以,如果我有:
<b>Bold Stuff</b>

我想要一个正则表达式,让我得到
Bold Stuff

但是到目前为止,我的所有解决方案都留下了类似以下的东西
>Bold Stuff<

我真的很感激任何关于这个的帮助。
我有。
>.*?<

我看到了一个在 Stack Overflow 上的问题,并有建议的解决方案。
>([^<>]*)<

但是这两个对我都不起作用。请问有人能解释一下如何编写一个正则表达式,以便查找在字符x和y之间的字符串,但不包括x和y本身。
感谢任何帮助。

1
使用 re.findall 应该可以使 >([^<>]*)< 正常工作。 - vks
4个回答

9
>>> 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特殊序列在字符串中稍后匹配该组。
要匹配文字() ,请使用\(或\),或将它们包含在字符类中:[(] [)]。

3
也许更简单的方法是去掉HTML标签,只留下内容:
>>> import re
>>> re.sub('<[^<>]+>', '', '<b>Bold Stuff</b>')
'Bold Stuff'
>>> 

请注意,相比于使用适当的HTML解析器,使用正则表达式来删除HTML标签通常被认为是不良惯例,但如果您了解自己的内容并且可以依靠它,则可能没有问题。

2
我猜你的问题与从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的工具...


0
from bs4 import BeautifulSoup

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接