2017-10-17 44 views
1

我是網站從汽車網站上抓取數據以獲取價格。現在,我正在通過創建兩個單獨的列表來解決這個問題。定價數據和另一款車型。最終,我想要把每個列表加入到一起來創建一個csv。 我正在採取的解決這個問題的具體步驟如下:1)建立與網站的連接,2)創建兩個空列表來寫入數據,3)從頁面的每個部分選擇正確的數據,4 )迭代數據並將數據存儲到列表中(這是我遇到問題的地方),以及5)最終我將把這兩個列表作爲一個csv加入到一起。在Python中結合兩個單獨的WebScraped列表

from bs4 import BeautifulSoup 
import urllib2 

#1) establishing a connection to the website 
wiki = "http://www.morong.com/used-inventory/index.htm?start=16&" 
req = urllib2.Request(wiki) 
page = urllib2.urlopen(req) 
soup = BeautifulSoup(page, 'lxml') 

#2) creating two empty lists to write the data into 
valueHolder = [] 
nameHolder = [] 

#3) selecting the correct data from each part of the page 
value = soup.findAll("span", { "class" : "value" }) 

name = soup.findAll("a", {"class" : "url"}) 

#4) iterates over rows and turns each row into a text field 
for row in value: 
    valueholder = row.text 

for row in name: 
    nameHolder = row.text 
print(valueholder) 
print(nameHolder) 

當我打印valueHolder和nameHolder時,我只返回每個for-loop的最後一行。我怎樣才能打印所有的值?

回答

1

使用ZIP()函數來連接這兩個名單:

value = [row.text for row in value] 
name = [row.text for row in name] 
zipped_value_name = list(zip(value, name)) 

for row in zipped_value_name: 
    print(row) 

您還可以創建字典而不是列表dict_not_list = dict((zip(name, value))

+0

我正在回答這個問題。但我認爲這是OP所需要的 – wander95

+0

哇,太棒了!這工作。 –

0

簡單:

for row in value: 
    valueholder = row.text 
    print(valueholder) 

for row in name: 
    nameHolder = row.text 
    print(nameHolder) 
+1

」官僚康拉德你在技術上是正確的......最好的一種正確的。「 –

1

你重新分配您的循環中的valueHoldernameHolder標識符,而不是將元素添加到列表中。試試這個:

for row in value: 
      valueHolder.append(row.text)  
    for row in name: 
     nameHolder.append(row.text) 

要合併的列表,你可以使用一個map,如

combinations = list(map(lambda x,y: [x,y], nameHolder, valueHolder)) 
+0

恭喜,您只是重新創建了內置'zip()'函數

0

你的問題來自於重新綁定在你的循環(重新分配到)你valueHoldernameHolder變量:

# here you bind `valueHolder` to an empty list 
valueHolder = [] 
value = soup.findAll("span", { "class" : "value" }) 
for row in value: 
    # here you rebind it to `row.text` (loosing the empty list) 
    valueHolder = row.text 

你想要的是追加到列表,而不是:

valueHolder = [] 
value = soup.findAll("span", { "class" : "value" }) 
for row in value: 
    valueHolder.append(row.text) 

要合併兩個列表,你可以使用zip()

result = zip(nameHolder, valueHolder) 

這將創造的(name, value)元組的列表。

這就是說,不是做兩個不同的查找/循環附加到兩個不同的列表,你會更好地迭代父元素(源標記中的元素,它包含'值'跨度和'名稱「鏈接),並建立(name, value)元組的一個單獨的列表:

results = [] 
for item in soup.findAll("li", {"class":"item"}): 
    value = soup.find("span", { "class" : "value" }).text 
    name = soup.find("a", {"class" : "url"}).text 
    results.append((name, value)) 

這種方式,你有理由相信名稱和值將真正匹配,這migh不一定是你的解決方案的情況。 「