正则表达式:提取两个标记之间的文本

2 投票
2 回答
2367 浏览
提问于 2025-04-18 17:35

我正在尝试写一个Python解析器,从HTML页面中提取一些信息。

它应该从 <p itemprop="xxx"></p> 之间提取文本。

我使用了正则表达式:

m = re.search(ur'p>(?P<text>[^<]*)</p>', html)

但是如果它们之间有其他标签,这个正则表达式就无法解析文件。例如:

<p itemprop="xxx"> some text <br/> another text </p>

我了解到 [^<] 只能排除一个符号。那么,怎么写才能排除“</p>”呢?

2 个回答

1

1) 千万不要用正则表达式来解析HTML。

2) 下面这个正则表达式在某些情况下、某些HTML上可能会有效:

#!/usr/bin/python2.7

import re

pattern = ur'''
    (?imsx)             # ignore case, multiline, dot-matches-newline, verbose
    <p.*?>              # match first marker
    (?P<text>.*?)       # non-greedy match anything
    </p.*?>             # match second marker
'''

print re.findall(pattern, '<p>hello</p>')
print re.findall(pattern, '<p>hello</p> and <p>goodbye</p>')
print re.findall(pattern, 'before <p>hello</p> and <p><i>good</i>bye</p> after')
print re.findall(pattern, '<p itemprop="xxx"> some text <br/> another text </p>')

正如其他回答所提到的,.*? 是一种非贪婪模式,它可以匹配任何字符。

2

你可以使用:

m = re.search(ur'p>(?P<text>.*?)</p>', html)

这是一个懒惰匹配,它会匹配所有内容,直到遇到</p>为止。你还可以考虑使用一个HTML解析器,比如BeautifulSoup,安装后可以用CSS选择器来进行操作,像这样:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
m = soup.select('p[itemprop="xxx"]')

撰写回答