我正在尝试编写一个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>
之外的所有内容”?
答案 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>')
正如另一个答案所指出的,.*?
是与任何角色匹配的非贪婪模式。