我是正则表达式和 Python 的 urllib 的新手。我浏览了一个关于网络抓取的在线教程,它有以下代码。在研究了正则表达式之后,我觉得我可以在我的正则表达式中使用 (.+) 而不是 (.+?),但是我错了。我最终打印了比我想要的更多的 html 代码。我以为我掌握了正则表达式的窍门,但现在我很困惑。请向我解释这两个表达式之间的区别以及为什么它会占用这么多 html。谢谢!
附言。这是星巴克股票报价抓取工具。
import urllib
import re
url = urllib.urlopen("http://finance.yahoo.com/q?s=SBUX")
htmltext = url.read()
regex = re.compile('<span id="yfs_l84_sbux">(.+?)</span>')
found = re.findall(regex, htmltext)
找到打印
请您参考如下方法:
.+是贪婪的——它匹配直到不能再匹配,并且只返回需要的部分。
.+?不是——它一有机会就停止。
例子:
假设您有这个 HTML:
<span id="yfs_l84_sbux">foo bar</span><span id="yfs_l84_sbux2">foo bar</span>
这个正则表达式匹配整个事情:
<span id="yfs_l84_sbux">(.+)<\/span>
它一直走到尽头,然后“回馈”一个</span> ,但正则表达式的其余部分匹配最后一个 </span> , 所以完整的正则表达式匹配整个 HTML block 。
但是这个正则表达式在第一个 </span> 处停止:
<span id="yfs_l84_sbux">(.+?)<\/span>
