我正在尝试剪贴一个网站。每页包含到下一页的链接,即第一页具有链接“ /chapter1/page2.html”,其中具有链接“ /chapter1/page3.html”。最后一页没有链接。我正在尝试编写一个程序,该程序访问url,打印页面文本,搜索文本并找到下一页的url,并循环直到没有url的最后一页。我尝试使用if,else和return函数,但是我不知道需要在哪里放置它。
def scrapy(url):
result = requests.get(url, timeout=30.0)
result.encoding = 'cp1251'
page = result.text
link = re.findall(r"\bh(.+?)html", page) # finds link to next page between tags
print("Continue parsing next page!")
url = link
print(url)
return(url)
url = "http://mywebpage.com/chapter1/page1.html"
result = requests.get(url, timeout=30.0)
result.encoding = 'cp1251'
page = result.text
link = re.findall(r"\bh(.+?)html", page)
if link == -1:
print("No url!")
else:
scrapy(url)
不幸的是,它不起作用;它只做一个循环。您能告诉我我在做什么错吗?
答案 0 :(得分:0)
以下几点:要递归,scrapy需要自己调用。其次,递归函数需要针对基本情况和递归情况的分支逻辑。换句话说,您需要函数的一部分看起来像这样(伪代码):
if allDone
return
else
recursiveFunction(argument)
为了使您更容易被发现,您希望此分支逻辑在找到链接的行(称为re.findall的行)下方。如果找不到链接,那么便完成了。如果找到链接,则再次调用scrapy,并传递新找到的链接。您的scrapy函数可能还需要一些小的修复程序,但希望可以使您摆脱递归的困扰。
如果您想真正地善于思考递归,那么本书就是一本好书:https://www.amazon.com/Little-Schemer-Daniel-P-Friedman/dp/0262560992