模拟点击python中的javascript链接

时间:2012-11-18 00:52:44

标签: javascript python selenium web-scraping spidermonkey

我正在尝试整理餐馆的评论。 Urllib2适用于评论的初始页面,但是有一个链接可以加载下一个评论增量,这是一个javascript链接。示例页面为here,链接“Next 25”的代码为:

<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$RestRatings$Next','')" class="red" id="ctl00_ContentPlaceHolder1_RestRatings_Next">NEXT 25&gt;&gt; </a>

我已经查看了之前的所有答案(e.g.),我不得不说我不是更聪明。在Firebug中查看控制台并不能提供方便的链接。你能建议最好(最简单)的方法吗?

编辑: 感谢Seleniumnewbie,此代码将打印出评论中的所有评论。:

from selenium import webdriver
from BeautifulSoup import BeautifulSoup
import re

driver = webdriver.Firefox()

def getURLinfo(url):

    driver.get(url)
    html = driver.page_source
    next25 = "ctl00_ContentPlaceHolder1_RestRatings_Next"
    soup = BeautifulSoup(html)

    while soup.find(id=re.compile(next25)):            
        driver.find_element_by_id(next25).click()
        html = html + driver.page_source
        soup = BeautifulSoup(driver.page_source)

    soup = BeautifulSoup(html)
    comment = soup.findAll(id=re.compile("divComment"))

    for entry in comment:
        print entry.div.contents #for comments

    driver.close()

2 个答案:

答案 0 :(得分:2)

当用户点击该链接时,在客户端的javascript中调用函数__doPostBack。您提供的其他问题的链接假定​​此函数进行AJAX调用,然后将结果放在同一页面中。

但是,您链接到的评论页面不会这样做。它确实进行了AJAX调用,但随后重新加载了同一页面。我无法捕获AJAX调用的内容,因为它会立即重新加载,但由于页面只是使用新注释重新加载,我很确定它告诉服务器将您移动到下一页。

因此,为了获得您的下一页评论,您必须调用__doPostBack函数正在调用的相同URL,然后重新加载您所在的页面。为了找到这个网址,我会对他们的javascript进行去混淆并找到被调用的函数。我相信将要调用的实际URL将取决于该函数的参数,因此您希望确保复制它的功能。

答案 1 :(得分:1)

id="ctl00_ContentPlaceHolder1_RestRatings_Next"找到元素,然后点击它。