我正在尝试制作一个可以使用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)
答案 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]
或所有项目,无论如何您可以更改逻辑并相应地调用该函数。
希望这可以帮助。