Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有条件地刮取网站数据?_Python_Python 3.x_Selenium_Selenium Webdriver_Selenium Chromedriver - Fatal编程技术网

Python 如何有条件地刮取网站数据?

Python 如何有条件地刮取网站数据?,python,python-3.x,selenium,selenium-webdriver,selenium-chromedriver,Python,Python 3.x,Selenium,Selenium Webdriver,Selenium Chromedriver,我已经创建了一个webscraper,它可以从一个网站上抓取数据,如产品名称、价格、描述、商品号等。该抓取器被输入同一个网站的多个网址(这意味着它被输入ebay.com/手提包ebay.com/香水ebay.com/cameras等)。 我的问题是,如果某个网站说ebay.com/手提包有一个“RRP”栏,它会将其删除,但如果网站“ebay.com/cameras”没有RRP栏,那么程序会因为明显的原因而失败。 错误内容如下: selenium.common.exceptions.NoSuchE

我已经创建了一个webscraper,它可以从一个网站上抓取数据,如产品名称、价格、描述、商品号等。该抓取器被输入同一个网站的多个网址(这意味着它被输入ebay.com/手提包ebay.com/香水ebay.com/cameras等)。 我的问题是,如果某个网站说ebay.com/手提包有一个“RRP”栏,它会将其删除,但如果网站“ebay.com/cameras”没有RRP栏,那么程序会因为明显的原因而失败。 错误内容如下:
selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“xpath”,“选择器”:“/*[@id=“vi priceDetails”]/span[1]/span[2]/span”}

我如何确保程序不失败,而只是在RRP前面打印一个“-”? 下面是我的代码示例:

import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager


def scrape_products():
    website_address = [
        'https://www.ebay.co.uk/itm/The-Discworld-series-Carpe-jugulum-by-Terry-Pratchett-Paperback-Amazing-Value/293566021594?hash=item4459e5ffda:g:yssAAOSw3NBfQ7I0',
        'https://www.ebay.co.uk/itm/Edexcel-AS-A-level-history-Germany-and-West-Germany-1918-89-by-Barbara/293497601580?hash=item4455d1fe2c:g:6lYAAOSwbRFeXGqL']
    options = webdriver.ChromeOptions()
    options.add_argument('start-maximized')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)

    browser = webdriver.Chrome(ChromeDriverManager().install(), options=options)
    for web in website_address:
        browser.get(web)
        time.sleep(2)

        product_rrp = browser.find_element_by_xpath('//*[@id="vi-priceDetails"]/span[1]/span[2]/span').text
       #rest of code
        print(product_rrp)


if __name__ == "__main__":
        scrape_products()

我不知道如何解决这个问题。请帮帮我。谢谢

在这种情况下,可以使用find元素

elems=browser。通过xpath('/*[@id=“vi priceDetails”]/span[1]/span[2]/span')查找元素
如果len(elems)>0:
product\u rrp=elems[0]。文本

您可以使用try..except块。如果找到,则将打印else转到except block并打印其他值,然后继续循环

for web in website_address:
        browser.get(web)
        time.sleep(2)
        
        try:
            product_rrp = browser.find_element_by_xpath('//*[@id="vi-priceDetails"]/span[1]/span[2]/span').text           
            print(product_rrp)
        except:
            print("some value instead")
            continue

注意:我已更改选择器,因为您的选择器在我的电脑中不工作

有两种方法,使用
try except
block

try:
    product_rrp = browser.find_element_by_css_selector('.actPanel  div div:nth-child(2) span').text
    print(product_rrp)
except:
    print('no rpp')
或者使用
查找\u元素\u…
(使用
s
)并检查是否有结果

product_rrp = browser.find_elements_by_css_selector('.actPanel  div div:nth-child(2) span')
if product_rrp: # has results
   print(product_rrp[0].text) # notice the [0]
else:
   print('no rpp')