Сохранение результатов / выводов селена во время выполнения в текстовом файле с использованием Python - PullRequest
2 голосов
/ 04 июля 2019

Я запускаю скрипт в Python3 , используя Selenium . Я получаю вывод, что я ожидал. Теперь я хочу сохранить свои выходные данные в текстовом формате, или csv или json файл. Когда я пытаюсь запустить свой скрипт и сохранить результат в файл, я получаю сообщение об ошибке с open('bangkok_vendor.txt','a') как wt:

TypeError: объект 'NoneType' не вызывается

Это означает, что цикл в программе выполняется только один раз и не сохраняет данные в файле с именем bangkok_vendor.txt. В обычных программах Python Scraper не было бы проблем с хранением данных, но я впервые использую 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 Ответ

0 голосов
/ 04 июля 2019
  • Вам необходимо передать script2 в качестве параметра для функции copy_json и вызвать его при извлечении данных со страницы.
  • Измените w режим обряда на a ppend, в противном случае файл будет сбрасываться при каждом вызове функции 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()

...