2015-04-26 56 views
2

我正在尝试编写一个用于从博客文章和网站中提取文章文本的通用函数。如何从网站/博客中提取文章内容

一些简化的例子,我想能够处理:

随机网站:

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

它的工作原理比较好,因为我与测试的例子,但它仍然留下了一些分享和导航链接再加上如果一个页面使用了更神秘的类名,它不会工作。

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

+0

我投票结束这个题目,因为它属于http://codereview.stackexchange.com –

+2

它不是真的关于代码审查,更多关于网页抓取技术和/或图书馆的人谁不这样做专业可能不知道。由于这是一个悬而未决的问题,它看起来并没有明确的答案,我会接受我收到的答案之一。 – makhan

+0

由于工具和图书馆的建议,这将成为题外话题。 –

回答

1

有一个名为pismo的宝石实现了一些试图提取文章内容的算法。

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

+0

'pismo'非常擅长提取标题,但内容提取仅适用于'标准'博客,并且在删除格式时非常积极。我会阅读它的代码,但也许它会给我一些想法。 Boilerpipe看起来也不错,即使麻烦与红宝石使用,我会看看它,谢谢。 – makhan

+1

Pismo有3个提取算法。 'tree.rb','base.rb'和'cluster.rb'。我认为'tree.rb'给了我最好的总体表现。如果你想要比'pismo'或'boilerpipe'更好的性能,你需要编写自己的机器学习算法。过去我使用随机森林来从网页中提取有用的链接。机器学习算法将比基于启发式的方法更好地处理边缘案例,并且随着模型通过添加更多的训练数据变得更加聪明,可以更好地扩展规模,从而制定更好的启发式算法。 –

1

使用rapar这给设备写域特定的解析器像wordpress.com,blogspot.com等

+0

对于特定网站的详细解析比对许多网站的通用解析更好看,但看起来并不是非常积极的开发,但我会看看它,谢谢。 – makhan

+0

我用它,保养得很好 –

0

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

diffbot.com
embed.ly
textracto.com

其中一些工作非常好,而且据我所知,这些都很容易与Ruby集成。

相关问题