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

时间:2014-08-17 21:11:29

标签: python regex

我正在尝试编写一个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 个答案:

答案 0 :(得分:2)

您可以使用:

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

这是一个懒惰的匹配,它会匹配所有内容,直到</p>。您还应该考虑使用像BeautifulSoup这样的HTML解析器,安装后可以与CSS Selectors一起使用,如下所示:

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

答案 1 :(得分: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>')

正如另一个答案所指出的,.*?是与任何角色匹配的非贪婪模式。