如何从网站/博客中提取文章内容

时间:2015-04-26 07:07:28

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

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

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

随机网站:

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

的Blogspot:

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

我想出了什么(doc是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

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

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用rapar这使得设施可以编写像domainpress.com,blogspot.com等域特定的解析器

答案 2 :(得分:0)

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

diffbot.com
embed.ly
textracto.com

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