Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中组合两个单独的Web垃圾列表_Python_Csv - Fatal编程技术网

在Python中组合两个单独的Web垃圾列表

在Python中组合两个单独的Web垃圾列表,python,csv,Python,Csv,我从一个汽车网站上抓取数据来获取价格。现在,我通过创建两个单独的列表来解决这个问题;一个是定价数据,另一个是车型数据。最后,我希望获得每个列表,并将这两个列表连接在一起,以创建一个CSV。 我正在采取的解决此问题的具体步骤如下: 建立与网站的连接 创建两个空列表以将数据写入 从页面的每个部分选择正确的数据 迭代数据并将数据存储到列表中(这就是我遇到的问题) 最后,我将把这两个列表合并为一个CSV 从bs4导入美化组 导入urllib2 #1) 建立与网站的连接 维基=”http://www.mo

我从一个汽车网站上抓取数据来获取价格。现在,我通过创建两个单独的列表来解决这个问题;一个是定价数据,另一个是车型数据。最后,我希望获得每个列表,并将这两个列表连接在一起,以创建一个CSV。 我正在采取的解决此问题的具体步骤如下:

  • 建立与网站的连接
  • 创建两个空列表以将数据写入
  • 从页面的每个部分选择正确的数据
  • 迭代数据并将数据存储到列表中(这就是我遇到的问题)
  • 最后,我将把这两个列表合并为一个CSV
  • 从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))