使用 Python 在运行时将 selenium 结果/输出保存在文本文件中

Posted

技术标签:

【中文标题】使用 Python 在运行时将 selenium 结果/输出保存在文本文件中【英文标题】:Saving selenium results/output at run time in text file using Python 【发布时间】:2019-07-04 06:35:36 【问题描述】:

我正在使用 SeleniumPython3 中运行一个脚本。我得到了我期望的输出。现在,我想将我的输出保存到文本、csvjson 文件中。当我尝试运行我的脚本并将结果保存到一个文件时,我收到一个错误,open('bangkok_vendor.txt','a') as wt

TypeError:“NoneType”对象不可调用

这意味着程序中的循环只运行一次,并且不会将数据存储在名为bangkok_vendor.txt 的文件中。在普通的 python 刮板程序中,存储数据不会有任何问题,但这是我第一次使用selenium。你能帮我解决一下吗谢谢。

我正在尝试从我的终端命令运行此脚本,输出是要保存为任何文件格式的内容:

from selenium import webdriver
from bs4 import BeautifulSoup as bs
import csv
import requests

contents =[]

filename = 'link_business_filter.csv'

def copy_json():
    with open("bangkok_vendor.text",'w') as wt:
        for x in script2:
            wt.writer(x)
            wt.close()

with open(filename,'rt') as f:
    data = csv.reader(f)
    for row in data:
        links = row[0]
        contents.append(links)

for link in contents:
    url_html = requests.get(link)
    print(link)
    browser = webdriver.Chrome('chromedriver')
    open = browser.get(link)
    source = browser.page_source
    data = bs(source,"html.parser")
    body = data.find('body')
    script = body
    x_path = '//*[@id="react-root"]/section/main/div'
    script2 = browser.find_element_by_xpath(x_path)
    script3 = script2.text

    #script2.send_keys(keys.COMMAND + 't')
    browser.close()
    print(script3)

【问题讨论】:

【参考方案1】: 您需要将script2 作为copy_json 函数的参数传递,并在从页面中提取数据时调用它。 将write模式更改为append,否则每次调用copy_json函数都会重置文件。 不要覆盖像open 这样的内置函数,否则一旦进入第二次迭代,您将无法打开文件写入数据。

我稍微重构了你的代码:

LINK_CSV = 'link_business_filter.csv'
SAVE_PATH = 'bangkok_vendor.txt'


def read_links():
    links = []
    with open(LINK_CSV) as f:
        reader = csv.reader(f)
        for row in reader:
            links.append(row[0])
    return links


def write_data(data):
    with open(SAVE_PATH, mode='a') as f:
        f.write(data + "\n")


if __name__ == '__main__':
    browser = webdriver.Chrome('chromedriver')

    links = read_links()
    for link in links:
        browser.get(link)

        # You may have to wait a bit here 
        # until the page is loaded completely

        html = browser.page_source

        # Not sure what you're trying to do with body 
        # soup = BeautifulSoup(html, "html.parser")
        # body = soup.find('body')

        x_path = '//*[@id="react-root"]/section/main/div'
        main_div = browser.find_element_by_xpath(x_path)
        text = main_div.text

        write_data(text)

    # close browser after every link is processed
    browser.quit()

【讨论】:

以上是关于使用 Python 在运行时将 selenium 结果/输出保存在文本文件中的主要内容,如果未能解决你的问题,请参考以下文章

在python运行时将数据从GUI传递给线程

使用 Python 在 Selenium 中运行 javascript

Selenium用法详解Options选项JAVA爬虫

无法使用 unittest 使用 python 运行 selenium

“Firefox 意外退出。”在 Python 中运行基本 Selenium 脚本时

在 Python 中使用 chromedriver_autoinstaller 运行 selenium 时出现问题