2013-03-09 39 views
0
urllist = ['http://example.com', 
      'http://example1.com'] 
i = 0 
while i < len(urllist): 
    source = urllib.urlopen(urllist[i]).read() 
    regex = '(\d{3})/">(\w+\s-\s\w+)</a>' # e.g. '435', 'Tom-Jerry' 
    p = re.compile(regex) 
    db = re.findall(p, source) 
    db = [tuple(filter(None, t)) for t in db] 

    hero_id = [] 
    for j in db: 
     hero_id.append(j[0]) 

    i += 1 
print hero_id 

需要注意的是:db = [tuple(filter(None, t)) for t in db]db是這樣的元組的列表:[('564', 'Tom', 'Jerry'), ('321', 'X-man', 'Hulk')]。在hero_id = []線上,一切都像一個魅力。 for foop需要附加每個數字(來自urllist的每個網址)。它的部分工作。在末尾hero_id列表只包含最後一個網址中的數字(之前的數字已消失)。想法?追加號碼列表

回答

4

那是因爲你在「而」(hero_id = []

將每一次迭代hero_id設置爲空列表剛過i = 0

也可以簡單地像這樣的代碼:

urllist = ['http://example.com', 'http://example1.com'] 
hero_id = [] 
for url in urllist: 
    db = re.findall('(\d{3})/">(\w+\s-\s\w+)</a>', urllib.urlopen(url).read(), re.DOTALL) 
    for j in db: 
     hero_id.append(tuple(filter(None, j))[0]) 
print hero_id 
+0

使用'requests'庫,或粘到STDLIB,使用'urllib2.urlopen'替代將是一個好主意...... – 2013-03-09 21:43:49

+0

請求並沒有真正necesarry,除非你需要aditional的數據發送到該網址或使用或代理或其他高級設置,雖然我同意urllib2比urllib更好,但這是nutship的決定,不是我的。 – 2013-03-09 21:49:49

1

由於您的hero_id在while循環中設置,因此每次迭代都會覆蓋它。 使您的hero_id變量爲全局變量,並且不要重置它。

hero_id = [] 
while(): 
    #your code 
+0

這已經是全球性的 – lolopop 2013-03-09 21:25:01

+1

範圍確實與此無關。 Python不會用塊創建一個新的範圍,只能用函數創建。 – 2013-03-09 21:25:56

+0

啊是的。由於代碼中沒有顯示外部聲明,所以我有點困惑。改變了答案。謝謝。 – 2013-03-09 21:27:34