在 JavaScript 执行后 python 加载网页

Load web page in python AFTER JavaScripts executes

我正在尝试根据用户输入的内容获取西班牙语(如字典)中单词的定义。这个想法是:

>>> hola
'1. interj. U. como salutación familiar.'

我首先尝试使用 urllib2,但由于定义是在 JS 执行后出现的(有道理),所以它没有用。我也尝试过 selenium,但据我了解,它必须打开一个导航器 window,对吧?我需要它像 urllib2,不可见。

如果你想试试,我搜索定义的页面是http://lema.rae.es/drae/?val=word,其中word是用户输入的词。

任何人有什么想法吗?

您可以通过 selenium:

自动化无头 PhantomJS 浏览器
>>> from selenium import webdriver
>>>
>>> driver = webdriver.PhantomJS()
>>> driver.get('http://lema.rae.es/drae/?val=word')
>>>
>>> description = driver.find_element_by_css_selector('div.field-content p.azul')
>>> print description.text
El Diccionario de la lengua española (DRAE) es la obra de referencia de la Academia. La última edición es la 23.ª, publicada en octubre de 2014. Mientras se trabaja en la edición digital, que estará disponible próximamente, esta versión electrónica permite acceder al contenido de la 22.ª edición y las enmiendas incorporadas hasta 2012.

我可能会像 那样做,但我会使用加载定义本身的 URL。例如,搜索 azul:

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get('http://lema.rae.es/drae/srv/search?val=azul')
print driver.find_element_by_css_selector("body>div").text

出现在问题中的 URL 会加载一个页面,然后该页面会在 iframe 元素中加载定义的 URL。使用上面显示的 URL 直接加载定义可以节省一些工作和一些复杂性:整个定义包含在 body 的第一个 div 子项中。不幸的是,它并没有消除对 JavaScript.

的需要

运行 上面的代码产生:

azul.
(Quizá alterac. del ár. hisp. lazawárd, este del ár. lāzaward, este del persa laǧvard o lažvard, y este del sánscr. rājāvarta, rizo del rey).
1. adj. Del color del cielo sin nubes. Es el quinto color del espectro solar. U. t. c. s.
2. m. El cielo, el espacio. U. m. en leng. poét.
3. m. Méx. Miembro del cuerpo de Policía.
~ de cobalto.
[... etc ...]

请注意,我没有检测到需要使用任何等待机制来检测页面内容是否已准备就绪。在调试器中查看页面 a) 我没有看到任何 Ajax 请求和 b) 查看 JavaScript 和页面本身,看起来服务的是一个混淆页面 JavaScript 然后反混淆 同步 。所以到 driver.get returns 时,内容应该可以使用了。