【问题标题】:How to extract article content from a website/blog如何从网站/博客中提取文章内容
【发布时间】:2015-07-04 16:05:34
【问题描述】:

我正在尝试编写一个通用函数,用于从博客文章和网站中提取文章文本。

我希望能够处理的一些简化示例:

随机网站:

...
<div class="readAreaBox" id="readAreaBox">
  <h1 itemprop="headline">title</h1>
  <div class="chapter_update_time">time</div>
  <div class="p" id="chapterContent">article text</div>
</div>
...

WordPress:

<div id="main" class="site-main">
  <div id="primary" class="site-content" role="main">
    <div id="content" class="site-content" role="main">
      <article id="post-1234" class="post-1234 post type-post">
        <div class="entry-meta clear">..</div>
        <h1 class="entry-title">title</h1>
        <div class="entry-content clear">
          article content
          <div id="jp-post-flair" class="sharedaddy">sharing links</div>
        </div>
      </article>
    </div>
  </div>
</div>

博客:

<div id="content">
  ...
  <div class="main" id="main">
    <div class="post hentry">
      <h3 class="post-title">title</h3>
      <div class="post-header">...</div>
      <div class="post-body">article content</div>
      <div class="post-footer">...</div>
    </div>
  </div>
</div>

我想出了什么(文档是Nokogiri::HTML::Document):

def fetch_content
  html = ''
  ['#content', '#main', 'article', '.post-body', '.entry-content', '#chapterContent'].each do |css|
    candidate = doc.css(css).to_html
    html = [html, candidate].select(&:present?).sort_by(&:length).first
  end
  self.content = html
end

对于我测试过的示例来说,它的效果相对较好,但它仍然会留下一些共享和导航链接,而且如果页面使用更隐秘的类名,它将无法工作。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我投票结束这个问题,因为它属于codereview.stackexchange.com
  • 这不是真正的代码审查,更多的是关于网络抓取技术和/或库的人可能不知道这方面的专业。由于这是一个悬而未决的问题,而且看起来没有明确的答案,我会接受我收到的答案之一。
  • 那将是题外话,因为工具和库建议是。
  • 不可能编写通用代码来处理所有网站,因为网站差异太大。您有时可以编写通用代码来处理使用模板生成页面的特定网站的页面,但即便如此,广告和 DHTML 也会让您感到困惑。

标签: ruby-on-rails ruby web-scraping nokogiri


【解决方案1】:

有一个名为 pismo 的 gem,它实现了几种尝试提取文章内容的算法。

有一个 java 库 boilerpipe,您可以从 JRuby 接口提取网页的文本内容。

【讨论】:

  • pismo 非常擅长提取标题,但内容提取仅适用于“标准”博客,并且在删除格式方面非常激进。我会阅读它的代码,尽管它可能会给我一些想法。 Boilerpipe 看起来也不错,即使用 ruby​​ 很麻烦,我也会看看,谢谢。
  • Pismo 有 3 个提取算法。 tree.rbbase.rbcluster.rb。我认为tree.rb 给了我最好的综合表现。如果您想要比pismoboilerpipe 更好的性能,您需要编写自己的机器学习算法。我过去曾使用随机森林从网页中提取有用的链接。机器学习算法将比基于启发式的方法更好地处理边缘情况,并且随着模型通过添加更多训练数据变得更加聪明,与制定更好的启发式方法相比,机器学习算法将更好地扩展。
【解决方案2】:

使用rapar 可以方便地编写特定领域的解析器,例如 wordpress.com、blogspot.com 等

【讨论】:

  • 对于特定网站的详细解析比对许多网站的通用解析看起来更好,而且看起来开发得不是很活跃,但我会看看,谢谢。
  • 我用过,保养得很好
【解决方案3】:

您也可以使用免费的文章提取 API,例如:

diffbot.com
embed.ly
textracto.com

其中一些工作得很好,据我所知,它们都很容易与 Ruby 集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多