Selenium点击

时间:2018-04-09 03:23:43

标签: selenium web-scraping

我正试图从这里榨取世界银行天然气价格预测:https://gallery.technet.microsoft.com/scriptcenter/0e43993a-895a-4afe-a2b2-045a5146048a

以下是我的代码:

url = "https://knoema.com/ncszerf/natural-gas-prices-forecast-long-term-2017-to-2030-data-and-charts"
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException

    #Open in  incognito mode
    option = webdriver.ChromeOptions()
    option.add_argument("--incognito")


    browser = webdriver.Chrome(executable_path=r"C:\Users\srai\Downloads\chromedriver_win32\chromedriver", chrome_options = option)
    browser.get(url)

    #Create a timeout error option
    timeout = 20
    try:
        WebDriverWait(browser, timeout).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="frozen-column-header"]/thead/tr/th[1]')))
    except TimeoutException:
        print("Timed out waiting for page to load")
        browser.quit()

#Click on maximize above the table before running this code
#MASSIVE PROBLEM FOR AUTOMATION

#Could also use "id". 
# Xpath does not work well 
ng_element = browser.find_elements_by_class_name('pivot-table')
ng_num = [x.text for x in ng_element]
ng_num[-2:]

#Split to get individual elements from two elements
ng = ng_num[-2:]
split_list =[i.split() for i in ng]
split_list

正如您可以从其中一条评论中注意到的那样,我正在尝试将其自动化以适应更大的脚本。问题是代码目前只从表中搜索了8年的数据,而不是整整十三年。

如果我将代码分成两个块并在运行第一个块之后转到打开的网页以最大化表以显示所有年份,然后通过id / class_name查找元素,我将获得所有13年。

所以我想我可以使用selenium点击最大化按钮,但我找不到最大化按钮的id或类。这只是我的一个想法,但请告诉我是否还有其他方法可以清除所有13年的数据。

谢谢!

沙善

1 个答案:

答案 0 :(得分:0)

我觉得Selenium方式很好,但是你尝试创建xpath的方式是错误的。因为当你描述像这个//*[@id="frozen-column-header"]/thead/tr/th[1]这样的xpath时,你总是希望它是一样的,但它可能会改变,添加或其他任何东西都可能改变它。例如,当我在谷歌chrome f12中使用这个xpath时,我可以在DOM中找到6个具有精确xpath的元素,因此1问题为什么你的脚本永远不会工作,因为它不知道他必须选择哪个元素/点击。

所以我建议像这样使用xpath:

(//*[@value='World Bank Commodity Price Data (Pink Sheet), Monthly Update']/ancestor::div[@class='bottom section']//div[@class='gadget-maximize'])[1]

因为这种方式你正在寻找精确的表格等等。

<强>解释

这个xpath正在查找表的第一个标识(这个标识很难在这个页面上,因为第一个表在表中没有值,第二个表有,所以我找到了两个表{{1}然后当我看到页面中的第一个元素是我需要的时候我可以执行此操作value='World Bank Commodity Price Data (Pink Sheet), Monthly Update'来查找我需要的第一个元素。尝试使用Google Chrome f12 (//*[@value='World Bank Commodity Price Data (Pink Sheet), Monthly Update'])[1]标签),然后使用此xpath { {1}}正在寻找具有此Elements(即展开按钮)作为其子元素的祖先(我也看到通过查看html DOM我需要第一个元素),而我和#39;我在/ancestor::div[@class='bottom section']//div[@class='gadget-maximize']中寻找DOM中的第一个元素。这将始终有效,直到wount出现在表中具有完全相同值的任何其他表。 (我说准确,因为现在页面上有两个)。

提示

选择css选择器vs xpath选择器。 Css选择器更快,但不能有复杂的查询,xpath选择器慢得多,维护xpath查询很难,但它可以有class="gadget-maximize"[1],{{1}的复杂查询},or和etc语句,你可以用它们构建你需要的任何xpath,如果正确创建了xpath,那么维护就会低于其他查询。