Python Regex - 在html标签之间找到字符串

时间:2015-10-14 08:43:22

标签: python html regex

我正在尝试在Html标记之间提取字符串。我可以看到类似的问题之前已经被问过堆栈溢出,但我对python是全新的,我正在努力。

所以,如果我有

<b>Bold Stuff</b>

我希望有一个正则表达式让我

Bold Stuff

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

这样的东西
>Bold Stuff<

我真的很感激任何帮助。

我有

>.*?<

我已经看到了关于堆栈溢出的问题,建议的解决方案

>([^<>]*)<

但这些都不适合我。请有人解释如何写一个正则表达式,说明&#34;找到字符x和y之间的字符串,不包括x和y&#34;。

感谢您的帮助

4 个答案:

答案 0 :(得分:5)

>>> 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特殊序列进行匹配,如下所述。

     

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

答案 1 :(得分:1)

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

str = '<b>Bold Stuff</b>';

m = re.search('>([^<>]*)<', str);
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的工具...

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

from bs4 import BeautifulSoup

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