如何在python中进行递归循环

时间:2014-12-28 19:41:19

标签: python recursion request web-scraping beautifulsoup

我正在尝试制作一个可以使用BeautifulSoup循环浏览页面的Web抓取工具

要做到这一点,我试着编写一个函数,调用我正在寻找的页面,找到下一个按钮的Href打印结果,然后将其分配给请求并重复递归打印每个函数下一个按钮的新值。

这就是我所拥有的,我无法弄清楚它不起作用。我没有错误,所以我认为我的结构可能会关闭。

提前谢谢。

import urllib.request
from bs4 import BeautifulSoup
import re

url = "http://www.calaiswine.co.uk/products/type/all-wines/1.aspx"
root_url = "http://www.calaiswine.co.uk"
first_index_url =  '/products/type/all-wines/1.aspx'

htmlFile = urllib.request.urlopen(url);

htmlText = htmlFile.read();

soup = BeautifulSoup(htmlText);

def cycle_to_next_page(foo):
    response = urllib.request.urlopen( root_url + foo)
    soup = BeautifulSoup(response)
    items = [a.attrs.get('href') for a in soup.findAll('a', title='Next')]
    print (cycle_to_next_page(items[0]))

cycle_to_next_page(first_index_url)

2 个答案:

答案 0 :(得分:2)

您的递归函数不返回任何内容,只是打印。

在Python中,不返回的函数被视为返回None。因此,Python会像您一样理解您的cycle_to_next_page(first_index_url)指令:

print(print(None))

我个人不会在这个例子中使用递归。只是一个基本for循环遍历items

答案 1 :(得分:1)

删除你的print就像@Jivan所解释的那样实际上递归调用函数,你不需要重复第一个`urllib.urlopen'既不调用,也可以打开具有相同功能的初始页面。像这样:

import urllib
from bs4 import BeautifulSoup

root_url = "http://www.calaiswine.co.uk"
first_index_url =  '/products/type/all-wines/1.aspx'


def cycle_to_next_page(link):
    response = urllib.urlopen(root_url+link)
    soup = BeautifulSoup(response.read())
    # my bs4 use find_all instead
    items = [a.attrs.get('href') for a in soup.find_all('a', title="Next")]
    print items[0]
    if items[0]:
        # here is the recursive function call, do a proper return, not print
        return cycle_to_next_page(items[0])
    print "crawling completed"
    return

# you can open your initial page with this function too
cycle_to_next_page(first_index_url)

#results:
/products/type/all-wines/2.aspx
/products/type/all-wines/3.aspx
/products/type/all-wines/4.aspx
...

此外,不确定您是否只需要items[0]或所有项目,无论如何您可以更改逻辑并相应地调用该函数。 希望这可以帮助。