我的webcrawler没有循环来获取所有链接 - 使用foo函数(Python)

时间:2013-10-25 06:21:28

标签: python-2.7 web-crawler

我正在创建一个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

1 个答案:

答案 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进行抓取的其他帮助