1

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

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

我已经查看了所有以前的答案(例如),我不得不说我一点也不聪明。在 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()
4

2 回答 2

2

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

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

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

于 2012-11-18T01:13:26.217 回答
1

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

于 2012-11-18T01:04:17.150 回答