【问题标题】:python 3 - selenium - printing text elements scraped from a web pagepython 3 - selenium - 打印从网页抓取的文本元素
【发布时间】:2016-08-16 09:46:55
【问题描述】:

阅读 J. Kazil 的“Data Wrangling with Python” 我在这个示例中是关于使用 Selenium 进行屏幕阅读的。代码(按照作者给出的代码)是这样的:

    # sele.py

    1 import time  
    2 from selenium import webdriver

    8 browser = webdriver.Firefox()  
    9 browser.get('http://www.fairphone.com/we-are-fairphone/')

   11 iframe = browser.find_element_by_xpath("//iframe[@id='twine-iframe-none']")  
   12 new_url = iframe.get_attribute('src')    
   13 browser.get(new_url)   
   14 time.sleep(4)  
   15   
   16 all_bubbles = browser.find_elements_by_css_selector('div.content')  
   17 for elem in all_bubbles:  
   18     print(elem.text)

我更改了本书的一些代码:
第 11 行:“Data Wrangling”作者的原始代码仅将 //iframe 用于 xpath 表达式,导致空白页
第 14 行:我在这里添加了超时,因为没有超时,所有发生的只是命令行光标的返回
第 18 行:原始代码适用于 Python 2,但将示例更改为 Python 3 到目前为止已经奏效(我现在在第 320 页)

会发生一个新的浏览器窗口打开,加载 fairphone 的主页,并切换到 iframe 部分。这一切都很好。下一点是打印出“气泡”内容,但这并没有发生。相反,我收集了一个相当冗长的错误消息:

Traceback (most recent call last):  
  File "sele.py", line 16, in module all_bubbles = browser.find_elements_by_css_selector('div.content')    
File ".../virtEnv/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 449, in find_elements_by_css_selector  
    return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)  
  File ".../virtEnv/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 778, in find_elements  
    'value': value})['value']  
  File ".../virtEnv/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute   
    self.error_handler.check_response(response)  
  File ".../virtEnv/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response  
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Permission denied to access property "handleEvent"  
Stacktrace:  
    at <anonymous> (http://apps-cdn.twinesocial.com/js-min/files/player%252Fbugsnag.js+player%252Fjquery-1.11.1.min.js+player%252Fjquery-easing-1.3.js+player%252Fjquery.timeago.js+player%252Fbootstrap-3.1.1.min.js+player%252Fisotope.pkgd.min.js+player%252Fjquery.lazy.min.js+player%252FjMinEmoji-SVG.min.js+player%252Ftheme-base.js+player%252Ftheme-base-utility.js+player%252Ftheme-base-toolbar.js+player%252Ftheme-base-fx.js+player%252Ftheme-base-manage.js+player%252FisInViewport.min.js+player%252FAnimOnScroll.js+player%252Fmodernizr.custom.js+player%252Fselect2.min.js+player%252Fhandlebars.min.js+player%252Ftheme%252Fclassic/v/2.9/t/1471301242.js:2)

我在虚拟环境中使用 Python 3.5(操作系统是 Ubuntu 16)。我被困在这里了,像Read the Docs 这样的文档只有助于推进到我现在所处的位置。 我知道有一些很酷的东西,比如 BeautifulSoup 或 Scrapy,但我现在想用 Selenium 来做这件事。

编辑: Another question 被识别为可能的重复项。 这个问题在 Bugsnag 和 Perl 的上下文中。不过,我通过添加尝试了提到的解决方法

15 active_element = browser.switch_to_active_element()

变化

16 all_bubbles = active_element.find_elements_by_css_selector('div.content')

产生了同样的错误信息。我注意到错误消息的最后部分确实在最后一行中嵌套了错误。我不确定这与我的设置有什么关系,因为我没有使用 bugsnag。但是,提及我使用 Firefox 48 和 Selenium 2.53.6 可能会有所帮助

【问题讨论】:

标签: python selenium web-scraping


【解决方案1】:

switch_to_active_element() 已被弃用。

所以,应该是:

 active_element = browser.switch_to.active_element

您可以参考this

【讨论】:

    【解决方案2】:

    我在使用时遇到完全相同的错误

    • 硒 3.141.0
    • 火狐 52.9.0
    • Raspbian/Debian 9

    上面的browser.switch_to.active_element 对我不起作用并抛出异常:

      File "/home/pi/.pyenv/versions/venv37/lib/python3.7/site-packages/myproject/uploader.py", line 102, in login
        element = self.driver.switch_to.active_element
      File "/home/pi/.pyenv/versions/venv37/lib/python3.7/site-packages/selenium/webdriver/remote/switch_to.py", line 44, in active_element
        return self._driver.execute(Command.GET_ACTIVE_ELEMENT)['value']
      File "/home/pi/.pyenv/versions/venv37/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
      File "/home/pi/.pyenv/versions/venv37/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.WebDriverException: Message: Permission denied to access property "handleEvent"
    

    感谢bugsnag-js的提示,我想这应该是在selenium中修复的,所以我尝试将它升级到4.0.0a3并解决了问题! 3.141.0 版本是最新的稳定版,但它于 2018 年 11 月 1 日发布(此时已使用两年)。所以这是我的解决方案:

    pip install selenium==4.0.0a3
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2020-06-21
      • 2015-12-14
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      相关资源
      最近更新 更多