在Python中组合两个单独的Web垃圾列表
我从一个汽车网站上抓取数据来获取价格。现在,我通过创建两个单独的列表来解决这个问题;一个是定价数据,另一个是车型数据。最后,我希望获得每个列表,并将这两个列表连接在一起,以创建一个CSV。 我正在采取的解决此问题的具体步骤如下:在Python中组合两个单独的Web垃圾列表,python,csv,Python,Csv,我从一个汽车网站上抓取数据来获取价格。现在,我通过创建两个单独的列表来解决这个问题;一个是定价数据,另一个是车型数据。最后,我希望获得每个列表,并将这两个列表连接在一起,以创建一个CSV。 我正在采取的解决此问题的具体步骤如下: 建立与网站的连接 创建两个空列表以将数据写入 从页面的每个部分选择正确的数据 迭代数据并将数据存储到列表中(这就是我遇到的问题) 最后,我将把这两个列表合并为一个CSV 从bs4导入美化组 导入urllib2 #1) 建立与网站的连接 维基=”http://www.mo
从bs4导入美化组
导入urllib2
#1) 建立与网站的连接
维基=”http://www.morong.com/used-inventory/index.htm?start=16&"
req=urlib2.Request(wiki)
page=urlib2.urlopen(请求)
汤=美汤(第“lxml”页)
#2) 创建两个空列表以将数据写入
估价师=[]
姓名持有者=[]
#3) 从页面的每个部分选择正确的数据
value=soup.findAll(“span”,{“class”:“value”})
name=soup.findAll(“a”,{“class”:“url”})
#4) 迭代行并将每行转换为文本字段
对于值中的行:
valueholder=row.text
对于名称中的行:
nameHolder=row.text
打印(价值持有人)
印刷品(姓名持有人)
当我打印valueHolder
和nameHolder
时,我只返回每个for循环的最后一行。如何打印所有值 简单地说:
for row in value:
valueholder = row.text
print(valueholder)
for row in name:
nameHolder = row.text
print(nameHolder)
使用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\u not\u list=dict((zip(name,value))
您在循环中分配valueHolder
和nameHolder
标识符,而不是向列表中添加元素。请尝试以下操作:
for row in value:
valueHolder.append(row.text)
for row in name:
nameHolder.append(row.text)
要组合列表,可以使用映射
,例如
combinations = list(map(lambda x,y: [x,y], nameHolder, valueHolder))
您的问题来自重新绑定(重新分配)循环中的
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()
:
这将创建一个(名称、值)
元组列表
这就是说,与其在两个不同的列表中附加两个不同的查找/循环,不如迭代父元素(源标记中同时包含“value”span和“name”链接的元素),并构建一个(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))
通过这种方式,您可以合理地确定名称和值将真正匹配,而您的解决方案可能不一定如此。“科雷尔·康拉德,您在技术上是正确的……最好的正确。”我本来打算回答这个问题。但我想这是OP需要的。经过计算,您刚刚重新发明了内置的
zip()
功能
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))