我正在从汽车网站上抓取数据以获取价格。现在,我正在通过创建两个单独的列表来解决问题;定价数据之一,另一个是汽车模型。最终,我想把每个列表和两个一起加入以创建一个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循环的最后一行。如何打印所有值?
答案 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)
您在循环中重新分配valueHolder
和nameHolder
标识符,而不是向列表中添加元素。试试这个:
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)
您的问题来自重新绑定(重新分配)循环中的valueHolder
和nameHolder
变量:
# 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))
通过这种方式,您可以确定名称和价值是否真的匹配,而且不一定是您的解决方案的情况。