Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 webdriver使用python来刮取动态页面,但找不到元素_Python_Selenium_Selenium Webdriver_Web Scraping_Scraper - Fatal编程技术网

Selenium webdriver使用python来刮取动态页面,但找不到元素

Selenium webdriver使用python来刮取动态页面,但找不到元素,python,selenium,selenium-webdriver,web-scraping,scraper,Python,Selenium,Selenium Webdriver,Web Scraping,Scraper,因此,关于stackoverflow上的动态内容抓取,有很多问题被问到,我已经讨论了所有这些问题,但所有建议的解决方案都不能解决以下问题: 背景: 在python中使用SeleniumWebDriver 我主要使用这个资源:关于Python.org示例 要刮取的页面: 问题: 我无法访问此页面上的任何DOM元素。注意如果我能得到一些关于如何访问搜索栏和搜索按钮的提示,那将是一个很好的开始。 最后,我想要的是浏览地址列表,启动搜索,并复制屏幕右侧显示的信息 我尝试了以下方法: 更改了webd

因此,关于stackoverflow上的动态内容抓取,有很多问题被问到,我已经讨论了所有这些问题,但所有建议的解决方案都不能解决以下问题:

背景:
  • 在python中使用SeleniumWebDriver
  • 我主要使用这个资源:关于Python.org示例
  • 要刮取的页面:
问题: 我无法访问此页面上的任何DOM元素。注意如果我能得到一些关于如何访问搜索栏和搜索按钮的提示,那将是一个很好的开始。 最后,我想要的是浏览地址列表,启动搜索,并复制屏幕右侧显示的信息

我尝试了以下方法:

  • 更改了webdriver的浏览器(从Chrome到Firefox)
  • 增加了页面加载的等待时间

    try:
        WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "addressInput")))
    except:
        print "address input not found"
    
  • 试图通过ID、XPATH、名称、标记名等访问该项,但无效
问题

  • 到目前为止,我还可以尝试什么(使用SeleniumWebDriver)
  • 有些网站真的不可能被刮掉吗?(我不认为每次我重新加载页面时,城市都会使用算法生成任何随机DOM)

您可以使用此url
http://50.17.237.182/PIM/
要获取源代码:

In [73]: from selenium import webdriver


In [74]: dr = webdriver.PhantomJS()

In [75]: dr.get("http://50.17.237.182/PIM/")

In [76]: print(dr.find_element_by_id("addressInput"))
<selenium.webdriver.remote.webelement.WebElement object at 0x7f4d21c80950>
如果您访问
http://50.17.237.182/PIM/
在浏览器中,您将看到与
propertymap.sfplanning.org/
完全相同的内容,唯一的区别是您可以使用前者完全访问元素

如果要输入一个值并单击搜索框,它类似于:

from selenium import webdriver


dr = webdriver.PhantomJS()
dr.get("http://propertymap.sfplanning.org/")

dr.switch_to.frame(0)

dr.find_element_by_id("addressInput").send_keys("whatever")
dr.find_element_by_xpath("//input[@title='Search button']").click()
但是如果您想提取数据,您可能会发现使用url进行查询是一个更简单的选项,您将从查询中获得一些json


使用“按*查找”方法之一“发送关键字”查找搜索字段。输入问题是找不到元素。。。不是关于如何发送密钥。你的问题有两个部分:“如果我能得到一些关于如何访问搜索栏和搜索按钮的提示”。。。我提供了各种查找(
find\u by.*
)以定位元素的方法。(被接受的答案选择了
find\u element\u by\u id
)。另外请注意,按enter键绕过元素查找和模拟单击在实践中往往更快、更可靠。我认为您只需要切换到
iframe
驱动程序。切换到.frame(0)
,对吗?@alecxe,是的,这会更容易:)@padraiccnningham:非常感谢,这真是太美了——我对自己很生气,因为我从来没有想过要看它。我花了整整两天的时间在这上面…@AudreyBascoul,不客气,最后的图像不是最好的,但是如果你打开firebig或chrome开发工具并监视网络请求,你会更清楚地了解正在发生的事情。@PadraicCunningham谢谢!有时我用小提琴。关于使用url发送查询的注意事项:)
In [77]: dr = webdriver.PhantomJS()

In [78]: dr.get("http://propertymap.sfplanning.org/")

In [79]:  dr.switch_to.frame(0)  

In [80]: print(dr.find_element_by_id("addressInput"))
<selenium.webdriver.remote.webelement.WebElement object at 0x7f4d21c80190>
from selenium import webdriver


dr = webdriver.PhantomJS()
dr.get("http://propertymap.sfplanning.org/")

dr.switch_to.frame(0)

dr.find_element_by_id("addressInput").send_keys("whatever")
dr.find_element_by_xpath("//input[@title='Search button']").click()