【问题标题】:How can I ignore (Bypass) an "Unable to locate element" exception?如何忽略(绕过)“无法定位元素”异常?
【发布时间】:2021-09-17 07:23:35
【问题描述】:

我使用 Python Selenium 抓取网站,但我的爬虫因异常而停止:

selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{"method":"css selector","selector":"[id="priceblock_ourprice"]"}

即使没有附加元素,如何继续爬取?

我的代码:

from selenium import webdriver
browser = webdriver.Chrome()
#Product1
browser.get('https://www.amazon.com.tr/Behringer-High-Precision-Crossover-Limiters- 
Adjustable/dp/B07GSGYRK1/ref=sr_1_1?dchild=1&keywords=behringer+cx3400+v2&qid=1630311885&sr=8- 
1')
price = price = browser.find_element_by_id('priceblock_ourprice')
price.text
import numpy as np
import pandas as pd
df = pd.DataFrame([["info", "info", price.text]], columns=["Product", "Firm", "Price"])
df.to_csv('info.csv', encoding="utf-8", index=False, header=False)
df_final = pd.read_csv('info.csv')
df_final.head()
browser.quit()

【问题讨论】:

  • 1) 编写一个方法来检查元素是否存在。 2) 如果不存在,则返回 false 值,然后跳过其他操作。

标签: python selenium


【解决方案1】:

如果你想在没有找到元素的情况下继续抓取,你可以使用try-except块。

try:
   price = browser.find_element_by_id(id_).text
except:
   print("Price is not found.")
   price = "-"     # for dataframe

或者,您可以创建一个函数来检查是否存在并采取相应措施。一种方法:

from selenium import webdriver
browser = webdriver.Chrome()
import numpy as np
import pandas as pd

def check_if_exists(browser, id_):
    return len(browser.find_elements_by_css_selector("#{}".format(id_))) > 0

browser.get('https://www.amazon.com.tr/Behringer-High-Precision-Crossover-Limiters-Adjustable/dp/B07GSGYRK1/ref=sr_1_1?dchild=1&keywords=behringer+cx3400+v2&qid=1630311885&sr=8-1')

id_ = 'priceblock_ourprice'
price =  browser.find_element_by_id(id_).text if check_if_exists(browser, id_) else "-"

df = pd.DataFrame([["info", "info", price]], columns=["Product", "Firm", "Price"])
df.to_csv('info.csv', encoding="utf-8", index=False, header=False)
df_final = pd.read_csv('info.csv')
df_final.head()
browser.quit()

【讨论】:

  • 找不到元素如何继续执行的问题。
  • 好的,在亚马逊,有些产品的描述中没有price。提供的链接 OP 就是其中之一。据我了解,如果找不到元素,OP 正在寻找一种继续执行的方法。他不希望他的程序因为错误而停止执行。
  • 我建议不要将代码放在异常块中,最好有一个单独的元素检查方法,这样可以减少代码。
  • 我尝试根据您的建议实施另一种解决方案。如果可以进一步开发,请告诉我。
  • 谢谢@Muhteva 的工作。谢谢。我将展开抓取页面并重试。
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2011-01-22
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多