我想我可以写一些快速的代码来下载Facebook页面的“粉丝”数量。
出于某种原因,尽管我已经尝试了相当多的迭代,但我无法获得以下代码来确定HTML中的fans数量。在本例中,我在web上找到的其他解决方案都与regex不匹配。当然,在两个匹配的位之间有一些通配符是可能的吗?
我要匹配的文本是“6个X fans”,其中X是一个页面拥有的任意数量的fans-我想得到这个数字。
我正在考虑间歇性地轮询这些数据并将其写入文件中,但我还没有着手解决这个问题。我还想知道这是否是正确的方向,因为代码看起来相当笨拙。:)
import urllib
import re
fbhandle = urllib.urlopen('http://www.facebook.com/Microsoft')
pattern = "6 of(.*)fans" #this wild card doesnt appear to work?
compiled = re.compile(pattern)
for lines in fbhandle.readlines():
ms = compiled.match(lines)
print ms #debugging
if ms: break
#ms.group()
print ms
fbhandle.close()
不需要正则表达式
输出
埃文·福斯马克已经给出了一个很好的答案。这只是更多的信息。
你有这句台词:
一般来说,这不是一个好的正则表达式。如果输入文本为:
“全银河99个粉丝中的6个”
然后匹配组(括号内的内容)将是:
“全银河99个粉丝”
所以,我们想要一个模式,它能抓住你想要的东西,即使是像上面这样愚蠢的输入文本。
在这种情况下,是否匹配空白并不重要,因为当将字符串转换为整数时,空白将被忽略。但是让我们写一个忽略空白的模式。
使用
*
通配符,可以匹配长度为零的字符串。在这种情况下,我认为您总是需要一个非空的匹配,所以您需要使用+
来匹配一个或多个字符。Python提供了非贪婪匹配,因此可以用它重写。带有正则表达式的旧程序可能没有非贪心匹配,因此我还将给出一个不需要非贪心的模式。
所以,非贪婪模式:
另一个:
\s
表示“任何空白”,将匹配一个空格、一个制表符和一些其他字符(例如“表单源”)。\S
表示“任何非空白区域”,并匹配任何{第一个模式比第一个输入文本的模式要好:
“全银河99个粉丝中的6个”
它将返回一个匹配组,该组只有
99
。但试试其他愚蠢的输入文本:
“99个狂热粉丝中的6个”
它将返回一个匹配的
99 crazed
组。第二种模式根本不匹配,因为“疯狂”一词不是“粉丝”一词。
嗯。这里有最后一个模式,即使是愚蠢的输入文本,也应该总是做正确的事情:
\d
匹配任何数字('0'
到'9'
)。\D
匹配任何非数字。这将成功匹配任何远程非二义性的内容:
“全银河99个粉丝中的6个”
匹配组将是
99
。“99个狂热粉丝中的6个”
匹配组将是
99
。“99 41个粉丝中的6个”
它不匹配,因为里面有第二个号码。
要了解有关Python正则表达式的更多信息,可以阅读variouswebpages。为了快速提醒您,在Python解释器中,请执行以下操作:
当你从网页上“刮”文本时,你有时可能会碰到HTML代码。一般来说,正则表达式不是忽略HTML或XML标记的好工具(请参见here);最好使用Beautiful Soup解析HTML并提取文本,然后使用正则表达式获取真正需要的文本。
我希望这是有趣和/或教育。
您需要改用
re.search()
。使用re.match()
尝试将模式与整个文档匹配,但实际上您只是试图匹配文档中的一个片段。上面的代码打印:79,110
。当然,当它被其他人运行时,可能会是一个不同的数字。相关问题 更多 >
编程相关推荐