在JavaScripts执行后在python中加载网页

时间:2015-03-19 12:49:37

标签: python selenium web-scraping urllib2

我希望根据用户输入的内容来定义西班牙语(如字典)。这个想法是:

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

我首先尝试使用urllib2,但由于定义出现在执行JS之后(有道理),它没有用。我也尝试过selenium,但据我所知,它必须打开一个导航窗口,对吧?我需要它像urllib2,看不见。

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

任何想法,任何人?

2 个答案:

答案 0 :(得分:1)

您可以通过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.

答案 1 :(得分:1)

我可能会像alecxe suggested这样做,但我会使用加载定义本身的网址。例如,搜索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

问题中显示的网址会加载一个页面,然后在iframe元素中加载定义的网址。使用我在上面显示的URL直接加载定义可以节省一些工作和一些复杂性:整个定义包含在div的第一个body子项中。不幸的是,它并没有消除对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返回时,内容应该可以使用了。