2017-10-17 107 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不一定是你的解决方案的情况。 “