Python 从HTML内容中获取社交网络信息

Python 从HTML内容中获取社交网络信息,python,html-parsing,beautifulsoup,Python,Html Parsing,Beautifulsoup,我正在做一项关于在互联网上处理新闻文本的研究。因此,我正在编写一个程序,通过新闻url在数据库中获取和存储新闻 例如,这是一个随机(西班牙新闻网站)。因此,我使用beautifulsou获取HTML内容,经过一点简单的过程,我得到了新闻标题、摘要、内容、类别和更多关于新闻的信息 但是,正如我在示例中使用的新闻中所看到的,还有一些“社交网络”信息(新闻图像的右侧): 推荐数量(facebook) 推文数量(twitter) +1的数量(谷歌+) 我也想获得这些信息,所以我试图处理来自该部分的H

我正在做一项关于在互联网上处理新闻文本的研究。因此,我正在编写一个程序,通过新闻url在数据库中获取和存储新闻

例如,这是一个随机(西班牙新闻网站)。因此,我使用
beautifulsou
获取HTML内容,经过一点简单的过程,我得到了新闻标题、摘要、内容、类别和更多关于新闻的信息

但是,正如我在示例中使用的新闻中所看到的,还有一些“社交网络”信息(新闻图像的右侧):

  • 推荐数量(facebook)
  • 推文数量(twitter)
  • +1的数量(谷歌+)
我也想获得这些信息,所以我试图处理来自该部分的HTML内容,但它不在那里!这就是我所做的:

>>> import urllib
>>> from BeautifulSoup import BeautifulSoup as Soup
>>> news = urllib.urlopen('http://elcomercio.pe/mundo/1396187/noticia-horror-eeuu-cinco-ninos-muertos-deja-tiroteo-escuela-religiosa')
>>> soup = Soup(news.read())
>>> sociales = soup.findAll('ul', {'class': 'sociales'})[0].findAll('li')
>>> len(sociales)
3
这是Facebook部分的HTML内容:

>>> sociales[0] # facebook
<li class="top">
<div class="fb-plg">
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=224939367568467";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<div class="fb-like" data-href="http://elcomercio.pe/noticia/1396187/horror-eeuu-cinco-ninos-muertos-deja-tiroteo-escuela-religiosa" data-send="false" data-layout="box_count" data-width="70" data-show-faces="false" data-action="recommend"></div></div></li>
社交网站[0]#facebook
  • (功能(d、s、id){ var js,fjs=d.getElementsByTagName[0]; if(d.getElementById(id)){return;} js=d.createElement;js.id=id; js.src=“//connect.facebook.net/en_US/all.js#xfml=1&appId=224939367568467”; fjs.parentNode.insertBefore(js,fjs); }(文档“脚本”、“facebook jssdk”);
  • 推特部分:

    >>> sociales[1] # twitter
    <li><a href="https://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="elcomercio" data-lang="es">Tweet</a><script type="text/javascript" src="//platform.twitter.com/widgets.js"></script></li>
    
    社交网站[1]#推特
  • 谷歌+部分:

    >>> sociales[2] # google+
    <li><script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {lang: 'es'}
    </script><g:plusone size="tall"></g:plusone></li>
    
    社交网站[2]#谷歌+
  • {lang:'es'}
  • 正如您所看到的,我要查找的信息没有包含在HTML内容中,我猜它是通过某种API通过这些链接获得的

    因此,我的问题是:我是否可以从某条新闻的HTML内容中获得我正在寻找的信息(facebook推荐数量、推文数量、+1数量)?

    您使用的客户端(urllib)不会执行任何javascript,大多数社交插件都使用javascript来显示您想要的数据


    您需要的是一个能够运行javascipt的客户端,这是一个不错的选择,而且。

    这是我的解决方案。我之所以发布它,是因为也许有一天有人也会有同样的问题。我遵循@Hoff的建议,使用了
    phantomjs

    因此,首先我安装了它(Linux、Windows或MacOS都不重要)。您只需能够在提示符/控制台中将其作为命令运行,如:

    phantomjs file.js
    
    这是幻影

    然后,我制作了一个简单的脚本,它接收一个url并返回一个对象(在执行所有javascript之后):

    就这样

    PS:我只在Linux上测试过,所以如果你们中的任何人在Windows和/或MacOS上尝试过,请分享你们的“体验”。谢谢:)

    PS 2:我也在Windows上测试过,效果非常好


    我也在我的:)中发布了这个消息。

    有phantomjs python模块吗?以前有PyPhantomJs,但现在已经停止了,对于简单的用例,您可以简单地使用子流程来运行phantomjs linux命令
    import os
    import os.path
    import hashlib
    import subprocess
    from BeautifulSoup import BeautifulSoup
    
    PHANTOM_DIR = os.path.join(os.getcwd(), 'phantom')
    
    try:
        os.stat(PHANTOM_DIR)
    except OSError:
        os.mkdir(PHANTOM_DIR)
    
    PHANTOM_TEMPLATE = """var page = require('webpage').create();  
    page.open('%(url)s', function (status) {
        if (status !== 'success') {
            console.log('Unable to access network');
        } else {
            var p = page.evaluate(function () {
                return document.getElementsByTagName('html')[0].innerHTML
            });
            console.log(p);
        }
        phantom.exit();
    });"""
    
    def get_executed_soup(url):
        """ Returns a BeautifulSoup object with the parsed HTML of the url
            passed, after executing all the scripts in it. """
        file_id = hashlib.md5(url).hexdigest()
        PHANTOM_ABS_PATH = os.path.join(PHANTOM_DIR, 'phantom%s.js' % file_id)
        OUTPUT_ABS_PATH = os.path.join(PHANTOM_DIR, 'output%s.html' % file_id)
        phantom = open(PHANTOM_ABS_PATH, 'w')
        phantom.write(PHANTOM_TEMPLATE % {'url': url})
        phantom.close()
        cmd = 'phantomjs ' + PHANTOM_ABS_PATH + ' > ' + OUTPUT_ABS_PATH
        stdout, stderr = subprocess.Popen(cmd, shell=True).communicate()
        output = open(OUTPUT_ABS_PATH, 'r')
        soup = BeautifulSoup(output.read())
        output.close()
        os.remove(PHANTOM_ABS_PATH)
        os.remove(OUTPUT_ABS_PATH)
        return soup