【问题标题】:While Python is writing to CSV, the script is inserting new line in try / except block in the csv file当 Python 写入 CSV 时,脚本在 csv 文件的 try / except 块中插入新行
【发布时间】:2019-04-27 17:20:12
【问题描述】:

早安,

我是 Python 和 Selenium 的新手,需要帮助解决以下问题:

我的一个sn-p代码如下:

num_page_items = len(date)
blank = "0"
try:
    with open('results.csv', 'a') as f:
        for i in range(num_page_items):
            f.write(name[i].text + "#" + surname[i].text + "#" + ref[i].text + "#" + url[i].text + "\n")
except IndexError:
    with open('results.csv', 'a') as f:
            f.write(blank)

我有一些变量正在使用 selenium 抓取网站。 数据示例和预期输出如下:

姓名:Joe 姓氏:Soap Ref:1234 URL:www.example.com

姓名:Bill 姓氏:Smith Ref:4567 URL:www.dot.com

expected output

当所有元素都存在时,Python 脚本运行良好,但是当一个元素(在示例中:第二个条目中不存在 Ref)不存在时,输出如下

output when an element doesn't exist

如果网页上不存在该变量,我该怎么做才能将变量设置为“Null”,因此预期的新输出如下:

expected output when element doesn't exist

顺便说一句,我收到的错误不是 Selenium 异常, 但是是一个IndexError,因此使用“IndexError”除了 声明

编辑 - Felipe Gutierrez 的建议

Felipe 建议的大段代码:

for url in links:
        driver.get(url) #goes to the array and opens each link

        company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""") 
        date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")
        ref = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[3]""")
        title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
        urlinf = driver.current_url

        num_page_items = len(date)
        blank = "blank"

        for ref in ref:
            if ref is None:
                ref = 0

        with open('results.csv', 'a') as f:
            for i in range(num_page_items):
                f.write(company[i].text + "#" + date[i].text + "#" + ref[i].text + "#" + title[i].text + "#" + urlinf + "\n")

driver.close()

我现在收到以下错误:

Traceback(最近一次调用最后一次):文件“accc_for_loop_nest.py”, 第 50 行,在 f.write(company[i].text + "#" + date[i].text + "#" + ref[i].text + "#" + title[i].text + "#" + urlinf + "\n") 类型错误:'WebElement' 对象不支持索引

【问题讨论】:

  • 你真的应该考虑使用 csv 模块(这就是它的用途),
  • 谢谢。您能否提供一个适合我想要实现的示例

标签: python selenium web-scraping index-error


【解决方案1】:

您使用 try-catch 释放了您正在迭代的列表的索引,您可以尝试在插入循环之前测试 IndexError 值,并在该特定位置为列表分配零。比在没有异常处理的情况下进行插入。 比如:

for url in links:
    driver.get(url) #goes to the array and opens each link

    company = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[2]/ul/li/div/div[1]/span""") 
    date = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[1]/div[2]/div/span""")
    ref = driver.find_elements_by_xpath("""//*[contains(@id, 'node')]/div[1]/div[3]""")
    title = driver.find_elements_by_xpath("""//*[@id="page-title"]/span""")
    urlinf = driver.current_url

    num_page_items = len(date)
    blank = "blank"

    companyStrings = []
    dateStrings = []
    refStrings = []
    titleStrings = []

    with open('results.csv', 'a') as f:
            for i in range(num_page_items):
                companyStrings.append( company[i].text )
                dateStrings.append( date[i].text )
                refStrings.append( ref[i].text )
                titleStrings.append( title[i].text ) 
                if companyStrings[i] == '':
                    companyStrings[i] = '0'
                if dateStrings[i] = '':
                    dateStrings[i] = '0'
                if refStrings[i] == '':
                    refStrings[i] = '0'
                if titleStrings[i] == '':
                    titleStrings[i] = '0'
                f.write(companyStrings[i] + "#" + dateStrings[i] + "#" + refStrings[i] + "#" + titleStrings[i] + "#" + urlinf + "\n")

driver.close()

【讨论】:

  • 感谢 Felipe,我已对我的帖子进行了编辑以添加您的建议,但我现在又遇到另一个错误 - 不确定我是否将新的 for 循环放置在正确的位置。跨度>
  • 我更新了我的答案测试并告诉我,因为我现在没有如何测试它。
  • 更新我有一台电脑并测试了它,它现在应该可以工作了。
  • 感谢您的回复,我尝试了您的更新,现在收到以下错误:Traceback (most recent call last): File "accc_for_loop_nest.py", line 58, in <module> if len(company[i]) == 0: TypeError: object of type 'WebElement' has no len()
  • 刚刚再试一次 - 仍然是同样的错误。我试过 None, "", '' 都输出同样的错误
猜你喜欢
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
相关资源
最近更新 更多