我是Python的新手(我也没有任何编程培训),所以在我提出问题时请记住这一点。
我正在尝试搜索检索到的网页,并使用指定的模式查找所有链接。我已在其他脚本中成功完成此操作,但我收到错误消息
raise error, v # invalid expression
sre_constants.error:多次重复
我不得不承认我不知道为什么,但我又是Python和正则表达式的新手。但是,即使我不使用模式并使用特定链接(只是为了测试匹配),我也不相信我会返回任何匹配(当我打印match.group(0)时,没有任何内容发送到窗口。链接我测试过的是下面的注释。
有什么想法吗?通过例子我通常更容易学习,但是你能给予的任何建议都非常感谢!
布洛克
import urllib2
from BeautifulSoup import BeautifulSoup
import re
url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html"
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)
pattern = r'<a href="http://forums.epicgames.com/archive/index.php?t-([0-9]+).html">(.?+)</a> <i>((.?+) replies)'
#pattern = r'href="http://forums.epicgames.com/archive/index.php?t-622233.html">Gears of War 2: Horde Gameplay</a> <i>(20 replies)'
for match in re.finditer(pattern, page, re.S):
print match(0)
答案 0 :(得分:1)
你需要逃避文字'?'和你想要匹配的文字'('和')'。
此外,我认为你正在寻找'+?'提供的非贪婪匹配,而不是'?+'。
对于您的情况,请尝试:
pattern = r'<a href="http://forums.epicgames.com/archive/index.php\?t-([0-9]+).html"> (.+?)</a> <i>\((.+?) replies\)'
答案 1 :(得分:1)
这意味着你的正则表达式有错误。
(.?+)</a> <i>((.?+)
什么?+是什么意思?两个?和+是彼此相邻无关紧要的元字符。也许你忘了逃避'?'什么的。
答案 2 :(得分:1)
正如您所发现的那样,解析任意HTML并不容易正确。就像Beautiful Soup这样的包装。请注意,您在脚本中调用它,但之后不使用结果。有关如何使您的任务更轻松的示例,请参阅其文档here。
答案 3 :(得分:0)
延伸其他人的写作:
。?表示“任何字符中的一个或零个”
。+表示“一个或多个任何角色”
正如你所希望的那样,将两者结合起来毫无意义;他们是不同的,矛盾的“重复”人物。因此,关于“多次重复”的错误是因为您在正则表达式中将这两个“重复”字符组合在一起。要修复它,只需确定您实际要使用哪一个,然后删除另一个。
答案 4 :(得分:0)
import urllib2
import re
from BeautifulSoup import BeautifulSoup
url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html"
page = urllib2.urlopen(url).read()
soup = BeautifulSoup(page)
# Get all the links
links = [str(match) for match in soup('a')]
s = r'<a href="http://forums.epicgames.com/archive/index.php\?t-\d+.html">(.+?)</a>'
r = re.compile(s)
for link in links:
m = r.match(link)
if m:
print m.groups(1)[0]