2013-05-09 57 views
0

所以我问了很多关于这个主题的问题,我很抱歉。但是就是这样。链接提取列表

所以我有这样的代码:

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 
import sys 
from collections import defaultdict 

m_num=int(input('Enter number of monsters to look up: ')) 
for x in range(m_num): 
    name=input("Enter a monster's name: ") 
    url_name=name.replace(' ','_') 
    url=('http://yugioh.wikia.com/wiki/Card_Tips:{}'.format(url_name)) 
    page = urllib.request.urlopen(url) 
    soup = BeautifulSoup(page.read()) 
    content = soup.find('div',id='mw-content-text') 
    links = content.findAll('a') 
    link_lists = defaultdict(list) 
    for link in links: 
     link_lists[x].append(link.get('title')) 
all_lists = list(link_lists.values()) 
common_links = set(all_lists[0]).intersection(*all_lists[1:]) 
print('common links: ',common_links) 

我试图做的是有多少怪物的数量用户指定的许多名单是如何creatd。然后,每个列表都会填入该特定网站的所有链接。然后在所有列表中进行比较,看它们是否有类似的字符串。 (希望这是有道理的)。

所以我遇到的问题是,当我运行它,它到达print('common links:',common_links)部分它只打印出最后一个列表。它不会比较列表,也不会意识到其他列表已创建。

任何人都可以伸出援手吗?我一直在解决这个问题,我只是卡住了。

+0

无需确定需要先验多少名单。相反,使用循环为每个怪物创建一个新列表。 – bernie 2013-05-09 20:06:39

+0

我需要使用类似的东西来做到这一点吗? 'locals()['list {}'.format(str(i))] = []' – user1985351 2013-05-09 21:41:36

回答

1

link_lists引用每次迭代的新字典。您可以排除它:在for x in range(m_num)循环之前放all_lists = []all_lists.append([link.get("title") for link in links])注:并与循环替换最后3行,你不需要知道m_num在这种情况下:

all_lists = [] 
for name in iter(lambda: input("monster name"), ""): # loop until empty name 
    # ... 
    titles = [link["title"] for link in content.findAll('a', title=True)] 
    all_lists.append(titles) 
+0

这只是将所有内容添加到一个列表中。我试图比较多个列表,而不是创建一个包含所有内容的大量列表。但是“在这个名字里......”部分运作良好。 – user1985351 2013-05-09 21:40:30

+0

@ user1985351:没有。 'all_lists'是列表的列表。如果你不需要它,然后将'common_links' *移到循环中。 – jfs 2013-05-09 21:41:44