Зачистка нескольких URL в Selenium и запись в JSON - PullRequest
0 голосов
/ 21 октября 2018

Я работаю на скребке с использованием Selenium.

Я написал сценарий, и он исправляется, но я пытаюсь очистить несколько URL-адресов, а затем записать результаты в JSON.

Сценарий удаляется и печатается успешно, однако в JSON я получаю только один результат - подробности второго URL-адреса (я получаю оба результата при печати).

Как получить обаРезультаты URL?

Я думаю, что мне нужно добавить еще один FOR LOOP для данных JSON, но не могу понять, как его добавить!

Это код, с которым я работаю:

# -*- coding: UTF-8 -*-
from selenium import webdriver
import time
import json

def writeToJSONFile(path, fileName, data):
    filePathNameWExt = './' + path + '/' + fileName + '.json'
    with open(filePathNameWExt, 'a') as fp:
        json.dump(data, fp, ensure_ascii=False)

browser = webdriver.Firefox(executable_path="/Users/path/geckodriver")

urls = ['https://www.tripadvisor.co.uk/Restaurant_Review-g186338-d8122594-Reviews-Humble_Grape_Battersea-London_England.html','https://www.tripadvisor.co.uk/Restaurant_Review-g186338-d5561842-Reviews-Gastronhome-London_England.html']

data = {}
for url in urls:

    browser.get(url)
    page = browser.find_element_by_class_name('non_hotels_like')
    title = page.find_element_by_class_name('heading_title').text
    street_address = page.find_element_by_class_name('street-address').text

    print(title)
    print(street_address)


data = {}
data['title'] = title
data['street_address'] = street_address

filename = 'properties'
writeToJSONFile('./', filename, data)

browser.quit()

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы пытаетесь добавить значения с одинаковыми ключами в словарь, в то время как Python dict может содержать только уникальные ключи!Поэтому вместо того, чтобы писать второй title, вы просто перезаписываете его.То же самое с street_address

Вы можете попытаться сохранить данные в виде списка словарей:

data = []

for url in urls:
    browser.get(url)
    page = browser.find_element_by_class_name('non_hotels_like')
    title = page.find_element_by_class_name('heading_title').text
    street_address = page.find_element_by_class_name('street-address').text

    print(title)
    print(street_address)

    data.append({'title': title, 'street_address': street_address})
0 голосов
/ 21 октября 2018

Вы отдыхаете переменную данных после цикла ...

Итак ... что я сделал, это добавил индекс итерации, используя enumerate, и отформатировал его в ключ ...

Попробуйте, это должно работать:

from selenium import webdriver
import time
import json

def writeToJSONFile(path, fileName, data):
    filePathNameWExt = './' + path + '/' + fileName + '.json'
    with open(filePathNameWExt, 'a') as fp:
        json.dump(data, fp, ensure_ascii=False)

browser = webdriver.Firefox(executable_path="/Users/path/geckodriver")

urls = ['https://www.tripadvisor.co.uk/Restaurant_Review-g186338-d8122594-Reviews-Humble_Grape_Battersea-London_England.html','https://www.tripadvisor.co.uk/Restaurant_Review-g186338-d5561842-Reviews-Gastronhome-London_England.html']

data = {}
for i, url in enumerate(urls):

    browser.get(url)
    page = browser.find_element_by_class_name('non_hotels_like')
    title = page.find_element_by_class_name('heading_title').text
    street_address = page.find_element_by_class_name('street-address').text
    # this 'f' string formating is suported from Python 3.6+ you can use other format... (for a cleaner job use list see the excpted answer...) 
    data[f'{i}title'] = title
    data[f'{i}street_address'] = street_address

    print(title)
    print(street_address)


filename = 'properties'
writeToJSONFile('./', filename, data)

browser.quit()

Надеюсь, вы найдете это полезным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...