2012-11-18 101 views
1

我正在整理餐厅的评论。 Urllib2适用于评论的初始页面,但是有一个链接可以加载下一个增量评论,这是一个JavaScript链接。一个例子页here,并链接“下一步25”的代码是:模拟点击python中的JavaScript链接

<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() 

回答

1

id="ctl00_ContentPlaceHolder1_RestRatings_Next"查找元素,然后单击它。

+0

用什么工具 - 硒? – user578582

+0

是selenium webdriver – Amey

+0

好的,谢谢,我明天就试试看,并保持发布! – user578582

2

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

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

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

+0

谢谢,我找不到类似于javascript(“www”,“http”,“review”)中的url的东西,所以我使用了selenium brute force方法! – user578582