【问题标题】:Making AJAX calls with Python使用 Python 进行 AJAX 调用
【发布时间】:2015-07-22 06:56:42
【问题描述】:

我正在尝试使用自制的 Python 脚本从网页中获取锚元素的 href 属性的值。但是,当网页最初加载时,网页通过使用 AJAX jQuery 调用来接收锚元素所在的 div 元素的所有内容。 div 元素包含大约 90% 的网页内容。如何获取 div 元素的内容以及锚元素的 href 属性的值?

稍后,在我得到'href'属性的值之后,我想获取链接指向的网页的内容。但不幸的是,该调用也是使用 AJAX (jQuery) 进行的。当我在网络浏览器中点击这个时,地址栏中的网页地址没有变化,这意味着接收到的网页内容被加载到同一个网页中(上面提到的@987654326 @) 元素。

得到这个之后,我将使用 BeautifulSoup 来解析网页。那么,我怎样才能用 Python 做到这一点呢?我需要使用什么样的模块?以及需要的通用伪代码是什么?

顺便说一下,锚元素有一个onclick事件处理程序,它触发相应的jQuery函数,将内容加载到网页内的div元素中。

此外,如果解决方案需要,锚元素不与 id 关联。

【问题讨论】:

  • 'anchor' 元素,因为它位于 'div' 元素内,所以在页面第一次加载时也会使用 ajax jquery 调用来获取。
  • 所以,澄清一下,您正在使用 Python 抓取页面,并且与浏览器不同,ajax 调用没有发生,因此您看不到执行抓取所需的所有 html ?
  • @JLPeyret 是的,这正是我的问题所在。由于网页不是静态的,所以我事先不知道要废弃什么元素...
  • 同意 citruspi - 您需要一个能够执行该 ajax 调用的浏览器。但要注意一点 - 无头浏览器可能会因更新的 JS 功能而变得古怪 - 例如,phantomjs 会在 bind 上出错,直到最近的 v2 - 所以你需要确保它们可以与你的页面一起使用在他们投入太多时间之前感兴趣。在那张纸条上,phantompy 说它的状态已被放弃。
  • 您会考虑投票和/或接受以下答案吗?

标签: javascript jquery python html ajax


【解决方案1】:

您希望使用无头网络浏览器。看看Ghost.pyphantompy


我刚刚意识到phantompy 不再被积极开发,所以这里有一个Ghost.py 的例子。

我创建了一个空白的 HTML 页面。一些 JavaScript 添加了几个指向 div 的链接。

<html>
    <body>
        <div id="links">
            <!-- Links go here -->
        </div>
    </body>

    <script type="text/javascript">
        var div = document.getElementById('links');

        var link = document.createElement('a');
        link.innerHTML = 'DuckDuckGo';
        link.setAttribute('href', 'http://duckduckgo.com');

        div.appendChild(link);
    </script>
</html>

因此,如果您现在使用 Beautiful Soup 使用 soup.find_all('a') 之类的东西来抓取页面,您将不会获得链接,因为没有任何链接。

但我们可以使用无头浏览器为我们呈现内容。

>>> from ghost import Ghost
>>> from bs4 import BeautifulSoup
>>>
>>> ghost = Ghost()
>>>
>>> ghost.open('http://localhost:8000')
>>> 
>>> soup = BeautifulSoup(ghost.content)
>>> soup.find_all('a')
[<a href="http://duckduckgo.com">DuckDuckGo</a>]

如果您必须执行诸如单击链接以更改页面内容之类的操作,您也可以这样做。查看项目网站上的Sample use case

【讨论】:

  • 您好,您能详细说明一下您的答案吗?我目前正在查看您提到的链接,它们似乎很好,但是由于我是 Ghost 模块的新手,如果您能够详细说明您的答案,这将非常有帮助。
  • @Python_user 我添加了一些示例代码和一个示例链接,我认为这些示例与您要查找的内容相关。
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多