【问题标题】:Selenium Implementing Try Except with writing to JSONSelenium 实现 Try except 写入 JSON
【发布时间】:2018-10-21 19:22:40
【问题描述】:

我正在开发一个网络爬虫并尝试构建一些异常,因此当元素不存在时,它只会跳到下一个元素。

我正在抓取 10 多个元素,但不确定找到异常的最佳方法并使用所有这些元素转到下一个元素,我知道我可以执行 IF 语句或 Try/Except。

我曾尝试实现 Try/Except 概念(如下所示),但我认为我将其错误地用作 1。我在打印时遗漏了一些结果(不是例外的结果),2。它正在向 JSON 写入和打印不正确的数据,结果不存在 - 它似乎正在使用最后一行的数据(我认为)。

对于我正在抓取的所有元素,如果数据不存在,我该如何例外移动以抓取下一个元素?

我正在使用的代码如下(简化):

# -*- coding: UTF-8 -*-
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time
import json
import csv

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

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']


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

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

    try:
        day1 = page.find_element_by_xpath("//DIV[@class='hours content']//SPAN[@class='day'][text()='Monday']").text
    except NoSuchElementException:
        pass
    #day1_hours = page.find_element_by_xpath("//div[@class='hours content']//div[2]//span[2]//div[1]").text

        print(title)
        print(street_address)
        print(day1)
        #print(day1_hours)

    data.append({'title': title, 'street_address': street_address, 'day1': day1})

filename = 'properties'

writeToJSONFile('./', filename, data)

browser.quit()

按照 John 的建议进行更新,我已经添加了一个问题 - 尽管现在遇到了无效的语法错误!:

try:
    day1 = page.find_element_by_xpath("//DIV[@class='hours content']//SPAN[@class='day'][text()='Monday']").text
except NoSuchElementException:
        catch NoSuchElementException:
        day1 = 'Element not found'

【问题讨论】:

  • 问题 1. 哪些数据可能不存在? pagetitlestreet_address 还是只是 day1?问题2.为什么要通过文本"Monday"定位元素来抓取文本"Monday"
  • title、street_address 和 day1 可能都不存在。我也在寻找时间,所以需要时间和日期来匹配......如果这是有道理的......除非你知道更好的方法!谢谢!
  • 如果标题、街道地址和其他元素都可能丢失,那么您可能希望将每个 find_element... 调用包装在 try/catch 块中,以便在未找到时为其分配默认值。
  • @JohnGordon 是的,这就是我想要做的!只是努力让它发挥作用!谢谢!

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:

从您的代码布局中,您似乎可以找到pagetitlestreet_address 元素,但找不到day1 元素。如果发生这种情况,你想怎么处理?

如果您想完全跳过该网址,请将print()data.append(...) 语句移到try: 块内。

如果您想为day1 使用一些默认值,请在catch 块中分配它:

catch NoSuchElementException:
    day1 = 'Element not found'

【讨论】:

  • 我仍然想获得那个 URL,而不是那个不存在的元素!谢谢!
  • 你能告诉我如何在代码中实现它吗?我已经尝试过了,没有成功!谢谢!
  • day1 = 'Element not found' 代替pass 语句。
  • 好的,只是厌倦了获取和无效的语法错误!
  • 更新您的问题以包含新代码。如果我们不确切知道代码是什么,我们将无能为力。
猜你喜欢
  • 2013-11-13
  • 2022-10-08
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2017-05-14
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多