2013-05-09 72 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