Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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
Selenium/python—单击特定div中的所有元素_Python_Selenium_Web Scraping_Web Crawler - Fatal编程技术网

Selenium/python—单击特定div中的所有元素

Selenium/python—单击特定div中的所有元素,python,selenium,web-scraping,web-crawler,Python,Selenium,Web Scraping,Web Crawler,我正在学习使用selenium进行刮取,并尝试了其中一个SAP页面 链接是: 我打算做的是在目录面板上获取此页面的所有叶/最后一级URL。不幸的是,链接不是html格式的,只有当我们点击左侧面板上的每一个按钮时,它才会展开,而且,每一个按钮点击都会有更多的嵌套按钮!我需要单击所有这些并获取底层数据 我从识别xpath开始,并尝试单击它们,但会出现以下错误: import time driver = webdriver.Chrome("/Users/tarun/Downloads/chromed

我正在学习使用selenium进行刮取,并尝试了其中一个SAP页面

链接是:

我打算做的是在目录面板上获取此页面的所有叶/最后一级URL。不幸的是,链接不是html格式的,只有当我们点击左侧面板上的每一个按钮时,它才会展开,而且,每一个按钮点击都会有更多的嵌套按钮!我需要单击所有这些并获取底层数据

我从识别xpath开始,并尝试单击它们,但会出现以下错误:

import time
driver = webdriver.Chrome("/Users/tarun/Downloads/chromedriver")

driver.get("https://help.sap.com/viewer/2e167338c1b24da9b2a94e68efd79c42/4.2.4/en-US/")
time.sleep(20) #tried this
htmlSource = driver.page_source

buttonsSidePanel = driver.find_elements_by_xpath('//*[@id="toc"]/treecontrol/div/div[*]/div[1]/div[1]')
#also tried - //*[@id="toc"]/treecontrol/div/div[*]/div[1]/div[1]/span[1]
for x in buttonsSidePanel:
    x.click()
    time.sleep(1)


driver.close()
错误:
element不可见异常:消息:element不可见

在这方面,我有几个问题(如果其中一些问题很幼稚,请道歉) 1. )当我检查元素时,元素在html中是可见的!我不知道我做错了什么

  • 此外,如果按钮单击显示更多按钮,我如何递归单击底层按钮,或者是否有一种方法可以一次单击所有按钮,然后刮取数据?我看了一些stackoverflow问题,但无法解决我的任务

  • 3.)单击按钮后,现在我们如何刮取新生成的内容?

    这可能是因为请求的元素不立即可见,连接继续

    尝试使用预期条件等待(EC等待)


    这将等待元素可见,然后执行进一步的步骤。

    这可能是因为请求的元素不立即可见,连接将继续

    尝试使用预期条件等待(EC等待)


    这将等待元素出现,然后执行进一步的步骤。

    您可以尝试使用selenium的execute_脚本运行简单的js脚本。 试试这个。你也可以用类名来识别

    jscode='''
    var allButtons=document.getElementsByClassName('collapseicon');
    for( b of allButtons){
       b.click();
     }
    '''
    
    driver.execute_script(jscode);
    
    此外,为了包括子下拉列表,您将在下面的调用中获得所有页面内容/响应。请使用请求模块进行检查

    import requests
    url = "https://help.sap.com/http.svc/getpagecontent?deliverableInfo=1&deliverable_loio=2e167338c1b24da9b2a94e68efd79c42&language=en-US&state=PRODUCTION&toc=1&version=4.2.4"
    r = requests.get(url)
    print (r.json())
    

    您可以尝试使用selenium的execute_脚本运行简单的js脚本。 试试这个。你也可以用类名来识别

    jscode='''
    var allButtons=document.getElementsByClassName('collapseicon');
    for( b of allButtons){
       b.click();
     }
    '''
    
    driver.execute_script(jscode);
    
    此外,为了包括子下拉列表,您将在下面的调用中获得所有页面内容/响应。请使用请求模块进行检查

    import requests
    url = "https://help.sap.com/http.svc/getpagecontent?deliverableInfo=1&deliverable_loio=2e167338c1b24da9b2a94e68efd79c42&language=en-US&state=PRODUCTION&toc=1&version=4.2.4"
    r = requests.get(url)
    print (r.json())
    

    您是指htmlSource=driver.page_source button=WebDriverWait(driver,30)。直到(EC.presence_of_element_位于((By.XPATH,//*[@id=“toc”]/treecontrol/div/div[*]/div[1]/div[1]'))按钮。单击()仍然会出现相同的错误,您是否能够复制结果?您是指htmlSource=driver.page_source button=WebDriverWait(driver,30)。直到(EC.presence_of_element_location((By.XPATH,'/*[@id=“toc”]/treecontrol/div/div[*]/div[1]/div[1]'))按钮。单击()这仍然会给出相同的错误,您能够复制结果吗?在哪一行获得异常?@PrakashPalnati-在x中。单击()行,正如其中一个答案所建议的,这可能是时间上的问题,因为7次中有一次是有效的,但我仍然不确定,也不确定在哪里添加时间。sleep()在哪一行出现异常?@PrakashPalnati-在x.click()中正如其中一个答案所暗示的那样,这可能是时间上的问题,因为7次中有一次是有效的,但我仍然不确定,也不确定在哪里增加时间谢谢你的回答!我也会试试这个,你能在第三个问题上指导我吗?你说的删除新内容是什么意思?子下拉菜单??他们将有自己的选择器。如果你是删除的,我建议在API调用时使用这个网站的urllib/请求,响应将显示所有内容。在这种情况下,您可以只保存响应。是的,我指的是子下拉列表,但我们如何知道新的选择器是什么?就像在脚本中一样?您能详细说明urllib/requests部分吗?响应是否会显示所有内容,包括内部链接,是吗?我认为javascript部分不会被呈现!l在浏览器的“网络”选项卡中查看此调用,并观察JSON响应。它已获得左侧下拉列表中的所有内容。使用请求或urllib获取响应。我将在回答中为此添加代码通常没有自动方式,尤其是当您刮除外部网站时(对于内部,您可能会从开发团队那里了解到)。通常,我们会在浏览器中的网络选项卡中检查具有有意义名称的XHR请求,并检查它们的响应。(在我们的示例中,url显示getpagecontent)谢谢你的回答!我也会试试这个,你能在第三个问题上指导我吗?你说的删除新内容是什么意思?子下拉菜单??他们将有自己的选择器。如果你是删除的,我建议在API调用时使用这个网站的urllib/请求,响应将显示所有内容。在这种情况下,您可以只保存响应。是的,我指的是子下拉列表,但我们如何知道新的选择器是什么?就像在脚本中一样?您能详细说明urllib/requests部分吗?响应是否会显示所有内容,包括内部链接,是吗?我认为javascript部分不会被呈现!l在浏览器的“网络”选项卡中查看此调用,并观察JSON响应。它已获得左侧下拉列表中的所有内容。使用请求或urllib获取响应。我将在回答中为此添加代码通常没有自动方式,尤其是当您刮除外部网站时(对于内部,您可能会从开发团队那里了解到)。通常,我们会在浏览器中的网络选项卡中检查具有有意义名称的XHR请求,并检查它们的响应。(在我们的示例中,url显示getpagecontent)