【问题标题】:When writing current url to csv TypeError: can only concatenate list (not "tuple") to list将当前 url 写入 csv TypeError: can only concatenate list (not "tuple") to list
【发布时间】:2018-01-02 06:38:10
【问题描述】:

TypeError: can only concatenate list (not "tuple") to list add current url to new column

我正在运行一个获取当前 url 并将其写入 csv 文件的脚本,但我得到了:

    writer.writerow(row + (url1,))
TypeError: can only concatenate list (not "tuple") to list

因为这一行:对于数据中的行:在下面的代码中(它在不使用 driver.current url 时有效)

url1 = driver.current_url
with open('test.csv', 'a', newline='', encoding="utf-8") as outfile:
    writer = csv.writer(outfile)
    for row in data:
        writer.writerow(row + (url1,))

如果我添加:

for row in zip(data):

这会将所有数据放在一列中,并将链接放在第 2 列中,因为我希望每个数据位于不同的列中。

我明白了:

   col1                          col2
['Clyde', 'Annan', '2.65', 'https://www.linkhere.com']

期望:

col1    col2    col3     col4          
Clyde   Annan   2.65    https://www.linkhere.com

知道如何解决这个问题吗?

代码:

import csv
import os
import time
from random import shuffle
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait

driver = webdriver.Chrome()
driver.set_window_size(1024, 600)
driver.maximize_window()

driver.get('https://www.betstar.com.au/sports/soccer/44317884-football-scotland-ladbrokes-league-2/')


# XPaths for the data
groups = "//*[@class='fullbox']"

xp_bp1 = ".//*[@class='row'][1]//td[1]"
xp_ba1 = ".//*[@class='row'][2]//td[1]"
xp_bp3 = ".//*[@class='row'][1]//span"

while True:
    try:
        # wait for the data to populate the tables
        #wait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, (xp_bp1))))
        time.sleep(2)

        data = []
        for elem in driver.find_elements_by_xpath(groups):
            try:
                bp1 = elem.find_element_by_xpath(xp_bp1).text
            except:
                bp1 = None

            try:
                ba1 = elem.find_element_by_xpath(xp_ba1).text
            except:
                ba1 = None

            try:
                bp3 = elem.find_element_by_xpath(xp_bp3).text
            except:
                bp3 = None


            url1 = driver.current_url

            data.append([bp1, ba1, bp3, url1])
        print(data)
        url1 = driver.current_url
        with open('test.csv', 'a', newline='', encoding="utf-8") as outfile:
            writer = csv.writer(outfile)
            for row in data:
                writer.writerow(row + (url1,))

    except TimeoutException as ex:
        pass
    except NoSuchElementException as ex:
        print(ex)
        break

【问题讨论】:

  • 在您的问题中发布代码
  • 试试writer.writerow(row + [url1])

标签: python list csv selenium tuples


【解决方案1】:

你有data.append([bp1, ba1, bp3, url1]),这意味着当你这样做时

    for row in data:
        writer.writerow(row + (url1,))

row 已经包含url1。您希望 4 个数据元素出现在 csv 中,因此将代码更改为:

for row in data:
    writer.writerow(row)

【讨论】:

    【解决方案2】:

    (url1,) 它创建一个元组并导致问题,因此修复 替换

    with open('test.csv', 'a', newline='', encoding="utf-8") as outfile:
        writer = csv.writer(outfile)
        for row in data:
            writer.writerow(row + (url1,))
    

    使用以下代码:

    (也不需要做+ (url1,),因为它已经附加到数据data.append([bp1, ba1, bp3, url1])

    with open('test.csv', 'a', newline='', encoding="utf-8") as outfile:
        writer = csv.writer(outfile)
        for row in data:
            writer.writerow("\t".join(row))
    

    【讨论】:

    • 是否有解决方法,以便我可以包含当前 url 和所需输出等数据?
    猜你喜欢
    • 2019-05-26
    • 2021-02-02
    • 2014-07-31
    • 2020-09-25
    • 2022-10-23
    • 2021-04-26
    • 1970-01-01
    • 2021-08-31
    • 2022-11-01
    相关资源
    最近更新 更多