【问题标题】:Simulating clicking on a javascript link in python模拟点击python中的javascript链接
【发布时间】:2012-11-06 08:22:20
【问题描述】:

我正在整理餐馆的评论。 Urllib2 适用于评论的初始页面,但随后有一个链接可以加载 cmets 的下一个增量,这是一个 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,此代码将打印出评论中的所有 cmets。:

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

【问题讨论】:

    标签: javascript python selenium web-scraping spidermonkey


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢,我在 javascript 中找不到类似于 url 的内容(“www”、“http”、“review”),所以我采用了 selenium 蛮力方法!跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      相关资源
      最近更新 更多