python - 从HTML内容获取社交网络信息

标签 python html-parsing beautifulsoup

我正在研究如何处理互联网上的新闻文本。因此,我正在编写一个程序,通过新闻网址获取新闻并将其存储在数据库中。

例如,这是一个随机 news url (西类牙新闻网站)。因此,我使用 BeautifulSoup 获取 HTML 内容,经过一些简单的处理后,我获得了新闻标题、摘要、内容、类别以及有关新闻的更多信息。

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

  • 推荐数量(Facebook)
  • 推文数量 (twitter)
  • +1 的数量 (google+)

我也想获取这些信息,所以我尝试处理该部分的 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>

推特部分:

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

Google+ 部分:

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

正如您所看到的,我正在查找的信息不包含在 HTML 内容中,我猜测它是通过某种 API 通过这些链接获得的。

所以我的问题是:我是否可以从某个新闻的 HTML 内容中获取我正在寻找的信息(Facebook 推荐数量、推文数量、+1 数量)?

最佳答案

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

所以我首先安装了它(Linux、Windows 或 MacOS,没关系)。您只需能够在提示/控制台中将其作为命令运行,例如:

phantomjs file.js

这是 phantomjs installation guide .

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

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

就是这样!

PS:我只在 Linux 上进行了测试,因此如果你们有人在 Windows 和/或 MacOS 上尝试过此操作,请分享您的“经验”。谢谢:)

PS 2:我也在 Windows 中进行了测试,效果非常好!

我也在我的 personal blog 中发布了此内容:)

关于python - 从HTML内容获取社交网络信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996891/

相关文章:

python - 网络抓取中的 CSV 格式问题

python - 在beautifulsoup/python中查找带有特定文本的标签索引

python - 当感兴趣的列缺少单元格时,如何使用 difflab 创建人工键列来合并两个数据集?

python - `python -m foo.bar` 与 `python foo/bar.py` 本地导入

Python:If-else 语句

python - 无法使用 Selenium 单击下一步按钮

python - 从 html 文件的元素中提取信息

java - 如何删除字符串中 HTML 标记中的所有 HTML 属性

python - 获取内部 HTML - Selenium、BeautifulSoup、Python

python - 如何通过bs4传递搜索键并获取结果