Python中的正则表达式问题
好的,我正在写一个正则表达式,用来查找网站中的所有头部信息。
我已经编写了这个正则表达式:
regex = re.compile(r'''
<h[0-9]>\s?
(<a[ ]href="[A-Za-z0-9.]*">)?\s?
[A-Za-z0-9.,:'"=/?;\s]*\s?
[A-Za-z0-9.,:'"=/?;\s]?
''', re.X)
在我用Python的正则表达式测试工具运行它时,效果非常好。
这里有一些示例数据:
<body>
<h1>Dog </h1>
<h2>Cat </h2>
<h3>Fancy </h3>
<h1>Tall cup of lemons</h1>
<h1><a href="dog.com">Dog thing</a></h1>
</body>
在REDemo中,它也运行得很好。
但是,当我把它放到我的Python代码里时,它只打印出<a href="dog.com">
。
这是我的Python代码,我不确定我是不是哪里做错了,或者是不是在转换过程中出了问题。感谢你的帮助。
stories=[]
response = urllib2.urlopen('http://apricotclub.org/duh.html')
html = response.read().lower()
p = re.compile('<h[0-9]>\\s?(<a href=\"[A-Za-z0-9.]*\">)?\\s?[A-Za-z0-9.,:\'\"=/?;\\s]*\\s?[A-Za-z0-9.,:\'\"=/?;\\s]?')
stories=re.findall(p, html)
for i in stories:
if len(i) >= 5:
print i
我还要提到的是,当我把正则表达式中的(<a href=\"[A-Za-z0-9.]*\">)?
去掉时,它对非链接的<hN>
行也能正常工作。
6 个回答
2
因为锚点标签周围有大括号,所以那部分被当作一个捕获组来处理。这就导致只有捕获组的内容被返回,而不是整个正则表达式的匹配结果。
如果把整个正则表达式放在大括号里,你会发现正确的匹配结果会作为返回元组中的第一个元素出现。
不过,确实应该使用一个真正的解析器。
4
用正则表达式解析东西适合处理常规语言,但HTML并不是常规语言。现在网页上的内容往往很乱。BeautifulSoup这个工具可以处理这种杂乱的HTML,它的工作方式像浏览器一样,所以解析出来的HTML看起来更像浏览器显示的内容。
不过,它的速度不是特别快。如果你要解析格式正确的HTML,可以用lxml,但如果你不完全确定输入的HTML总是格式正确,还是建议使用BeautifulSoup。
23
最近几天,有很多人问过这个问题,所以我想说得很清楚。
问:我该如何用正则表达式解析HTML?
答:请不要这样做。
请使用 BeautifulSoup、html5lib 或 lxml.html。拜托了。