正则表达式:提取两个标记之间的文本
我正在尝试写一个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"]')