单击一页上的多个按钮时,Selenium Web Scrapping会返回错误

时间:2018-02-13 07:23:42

标签: python selenium dynamic web-scraping

真的需要这个社区的帮助!

当我尝试从旅游网站中删除动态内容时,只有点击“查看价格”时才能获得价格和相关供应商信息。网站上的按钮。所以我正在考虑使用' for loop'点击查看所有价格'查看价格'在我使用Selenium进行刮擦之前按钮。

问题是每个按钮都可以点击browser.find_element_by_xpath().click(),但当我创建一个包含所有按钮信息的列表时,会弹出一个错误:

代码块:

browser=webdriver.Chrome("C:/Users/Owner/Downloads/chromedriver_win32/chromedriver.exe")
url="https://www.cruisecritic.com/cruiseto/cruiseitineraries.cfm?port=122"
browser.get(url)
#print(browser.find_element_by_css_selector(".has-price.meta-link.show-column").text)
ButtonList=[ "//div[@id='find-a-cruise-full-results-container']/div/article/ul/li[3]/span[2]",
             "//div[@id='find-a-cruise-full-results-container']/div/article[2]/ul/li[3]/span[2]",
             "//div[@id='find-a-cruise-full-results-container']/div/article[3]/ul/li[3]/span[2]"]

for button in ButtonList:
    browser.implicitly_wait(20)
    browser.find_element_by_xpath(str(button)).click()

错误堆栈跟踪:

WebDriverException: unknown error: Element <span class="label hidden-xs-down" data-title="...">View All Prices</span> is not clickable at point (862, 12). Other element would receive the click: <a href="https://boards.cruisecritic.com" onclick="s_objectID='Primary Nav : Boards';">...</a>
  (Session info: chrome=63.0.3239.132)
  (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.16299 x86_64)

我的问题是如何在抓取之前点击网页上的所有按钮,或者如果我们必须点击某个按钮来解析和删除网页上的动态内容#39;将数据导入Python。附图是网页截图。

真的很感谢社区的帮助! enter image description here

3 个答案:

答案 0 :(得分:2)

您可能需要为您正在使用的Xpath寻找相对路径。 可能是在您执行数据时显示的数据仅部分存在的情况。

尝试的方法:

  1. 延长等待时间
  2. 更改xpath /使用相对xpath
  3. Splinter - 您可以将其用作浏览器调用常规方式
  4. 您需要在进行调用时检查DOM元素中是否存在数据。如果是这种情况,等到加载整个页面将帮助你。

答案 1 :(得分:1)

Hello使用以下代码点击每个价格按钮,如果需要,也可以引入隐式等待。

for one_row_view_price in browser.find_elements_by_xpath('//span[@data-title="View All Prices"]'):
     one_row_view_price.click()

如果您的BOT能够点击价格按钮

,请告诉我

由于

快乐编码

答案 2 :(得分:1)

以下是根据您的要求设计的功能:

def click_handler(xpath):
    # Find total number of element available on webpage
    xpath = re.sub('"', "'", xpath)
    total_element = browser.execute_script("""
                                                        var elements = document.evaluate("%s",
                                                        document,
                                                        null,
                                                        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                                                        null);
                                                        return elements.snapshotLength;
                                                        """ %xpath
                                                        )
    # Check if there is any element
    if(total_element):
    # Iterate over all found elements
        for element_pos in range(total_element):
            # Call click element function
            browser.execute_script("""
                             var elements = document.evaluate("%s",
                             document,
                             null,
                             XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                             null);
                             var im = elements.snapshotItem(%d);
                             im.click();
                             """ %(xpath, element_pos)
                             )
            print "***" + str(element_pos + 1) + " Elements clicked"    
        print "\n****************************"
        print "Total " + str(total_element) + " Elements clicked"
        print "****************************\n"
    # Inform user that there is no element found on webpage
    else:
        print "\n****************************"
        print "Element not found on Webpage"
        print "****************************\n"
        # Element not found on Webpage

click_handler('//span[@data-title="View All Prices"]')