我正在创建一个webcrawler,在第一步中,我需要抓取一个网站并提取其所有链接,但是我的代码没有循环提取。我尝试使用append但是会产生一个列表列表。我正在尝试使用foo,但我收到了一个错误。任何帮助,将不胜感激。谢谢
from urllib2 import urlopen
import re
def get_all_urls(url):
get_content = urlopen(url).read()
url_list = []
find_url = re.compile(r'a\s?href="(.*)">')
url_list_temp = find_url.findall(get_content)
for i in url_list_temp:
url_temp = url_list_temp.pop()
source = 'http://blablabla/'
url = source + url_temp
url_list.append(url)
#print url_list
return url_list
def web_crawler(seed):
tocrawl = [seed]
crawled = []
i = 0
while i < len(tocrawl):
page = tocrawl.pop()
if page not in crawled:
#tocrawl.append(get_all_urls(page))
foo = (get_all_urls(page))
tocrawl = foo
crawled.append(page)
if not tocrawl:
break
print crawled
return crawled
答案 0 :(得分:0)
首先,由于列出的所有原因,用正则表达式解析HTML是个坏主意:
您应该使用HTML解析器来完成作业。 Python在其标准库中提供了一个:HTMLParser,但您也可以使用BeautifulSoup甚至lxml。我喜欢BeautifulSoup,因为它有很好的API。
现在,回到你的问题,你正在修改你正在迭代的列表:
for i in url_list_temp:
url_temp = url_list_temp.pop()
source = 'http://blablabla/'
...
这很糟糕,因为它隐喻相当于锯掉你所坐的分支。 此外,您似乎不需要删除此项,因为没有必须删除网址的条件。
最后,使用append
后会出现错误,因为正如您所说,它会创建一个列表列表。您应该使用extend
代替。
>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> l1.append(l2)
>>> l1
[1, 2, 3, [4, 5, 6]]
>>> l1 = [1, 2, 3]
>>> l1.extends(l2)
>>> l1
[1, 2, 3, 4, 5, 6]
注意:请查看http://www.pythonforbeginners.com/python-on-the-web/web-scraping-with-beautifulsoup/以获取有关使用beautifulsoup进行抓取的其他帮助