如何在列表中的每个项目上应用函数

时间:2013-06-17 17:59:22

标签: python python-2.7

我有一个大约有21个网址的网站地图,每个网址都包含大约2000个网址。我试着写一些能让我解析原始21个网址的内容并抓住它们包含的2000个网址然后将其附加到列表中。

我现在一直在墙上砸了几天,试图让它发挥作用,但它一直在返回一个“无”的清单。我现在只使用python工作了大约3个星期,所以我可能会遗漏一些非常明显的东西。任何帮助都会很棒!

storage = []
storage1 = []

for x in range(21):
url = 'first part of the url' + str(x) + '.xml'
storage.append(url)

def parser(any):
    tree = ET.parse(urlopen(any))
    root = tree.getroot()
    for i in range(len(storage)):
        x = (root[i][0]).text
        storage1.append(x)

storage2 = [parser(x) for x in storage]

我也尝试使用带有计数器的while循环,但它总是在第一个2000 url之后停止。

4 个答案:

答案 0 :(得分:1)

parser()从不return任何内容,因此默认返回None,因此storage2包含None列表的原因。也许你想看看storage1中的内容?

答案 1 :(得分:1)

如果你没有在python中声明函数的返回,它会自动返回None。在parser内,您需要向storage1添加元素,但不会返回任何内容。我会试着这样做。

storage = []

for x in range(21):
    url = 'first part of the url' + str(x) + '.xml'
    storage.append(url)

def parser(any):
    storage1 = []
    tree = ET.parse(urlopen(any))
    root = tree.getroot()
    for i in range(len(storage)):
        x = (root[i][0]).text
        storage1.append(x)
    return storage1

storage2 = [parser(x) for x in storage]

编辑:正如Amber所说,您还应该看到所有元素实际存储在storage1中。

答案 2 :(得分:1)

如果我理解你的问题,你的程序有两个阶段:

  1. 您生成21个网址的初始列表
  2. 您可以在每个网址上抓取该网页,并从该网页中提取其他网址。
  3. 您的第一步可能如下所示:

    initial_urls = [('http://...%s...' % x) for x in range(21)]
    

    然后,要从页面填充大型URL列表,您可以执行以下操作:

    big_list = []
    
    def extract_urls(source):
        tree = ET.parse(urlopen(any))
        for link in get_links(tree):
            big_list.append(link.attrib['href'])
    
    def get_links(tree):
        ... - define the logic for link extraction here
    
    for url in initial_urls:
        extract_urls(url)
    
    print big_list
    

    请注意,您必须自己编写从文档中提取链接的过程。

    希望这有帮助!

答案 3 :(得分:0)

您必须在解析器函数中返回storage1

def parser(any):
    tree = ET.parse(urlopen(any))
    root = tree.getroot()
    for i in range(len(storage)):
        x = (root[i][0]).text
        storage1.append(x)
    return storage1

我认为这就是你想要的。