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