在Python

时间:2017-10-17 13:55:51

标签: python csv

我正在从汽车网站上抓取数据以获取价格。现在,我正在通过创建两个单独的列表来解决问题;定价数据之一,另一个是汽车模型。最终,我想把每个列表和两个一起加入以创建一个csv。 我正在采取的解决此问题的具体步骤如下:1)建立与网站的连接,2)创建两个空列表以将数据写入,3)从页面的每个部分选择正确的数据,4)迭代数据并将数据存储到列表中(这是我遇到问题的地方),5)最终我将两个列表作为一个csv加入。

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循环的最后一行。如何打印所有值?

4 个答案:

答案 0 :(得分: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))

答案 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))

答案 2 :(得分:0)

简单地:

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

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

答案 3 :(得分: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)元组列表。

这就是说,不是做两个不同的查找/循环附加到两个不同的列表,而是更好地迭代父元素(源标记中包含'值' span的元素和'名称'链接)并构建一个(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))

通过这种方式,您可以确定名称和价值是否真的匹配,而且不一定是您的解决方案的情况。

相关问题