如何仅从HTML页面中提取主要文本内容?

Ren*_*ani 19 html java information-retrieval jsoup

更新

Boilerpipe似乎工作得很好,但我意识到我不仅需要主要内容,因为许多页面没有文章,只有一些简短的描述链接到整个文本(这在新闻门户网站中很常见)和我不想丢弃这些短文.

因此,如果API执行此操作,请获取不同的文本部分/块以不同于单个文本的某种方式分割每个文本部分(仅在一个文本中都没有用),请报告.


问题

我从随机网站下载了一些页面,现在我想分析页面的文本内容.

问题是网页有很多内容,如菜单,宣传,横幅等.

我想尝试排除与页面内容无关的所有内容.

以此页面为例,我不希望上面的菜单既不是页脚中的链接.

重要提示:所有页面都是HTML,是来自各种不同网站的页面.我需要建议如何排除这些内容.

目前,我认为从HTML中删除"menu"和"banner"类中的内容以及看起来像正确名称(第一个大写字母)的连续单词.

解决方案可以基于文本内容(没有HTML标记)或HTML内容(使用HTML标记)

编辑:我想在我的Java代码中执行此操作,而不是外部应用程序(如果可以的话).

我尝试了解析此问题中描述的HTML内容的方法:https://stackoverflow.com/questions/7035150/how-to-traverse-the-dom-tree-using-jsoup-doing-some-content-filtering

Kur*_*lor 22

看看Boilerpipe.它旨在完全按照您的要求进行操作,删除网页主要文本内容周围的多余"杂乱"(样板,模板).

有几种方法可以将HTML提供给Boilerpipe并提取HTML.

您可以使用以下网址:

ArticleExtractor.INSTANCE.getText(url);
Run Code Online (Sandbox Code Playgroud)

你可以使用一个字符串:

ArticleExtractor.INSTANCE.getText(myHtml);
Run Code Online (Sandbox Code Playgroud)

还有使用Reader的选项,这会打开大量选项.


Chr*_*ter 7

您还可以使用boilerpipe文成全文/非全文本块,而不是只返回他们中的一个(基本上,boilerpipe段第一,然后返回一个字符串).

假设您可以从java.io.Reader访问HTML,只需让samppipe对HTML进行分段并为您分段:

Reader reader = ...
InputSource is = new InputSource(reader);

// parse the document into boilerpipe's internal data structure
TextDocument doc = new BoilerpipeSAXInput(is).getTextDocument();

// perform the extraction/classification process on "doc"
ArticleExtractor.INSTANCE.process(doc);

// iterate over all blocks (= segments as "ArticleExtractor" sees them) 
for (TextBlock block : getTextBlocks()) {
    // block.isContent() tells you if it's likely to be content or not 
    // block.getText() gives you the block's text
}
Run Code Online (Sandbox Code Playgroud)

TextBlock 有一些更令人兴奋的方法,随意玩!


小智 5

Boilerpipe似乎存在问题.为什么?好吧,它似乎适用于某些类型的网页,例如具有单一内容的网页.

因此,人们可以粗略地将网页分类为Boilerpipe三种:

  1. 一个包含一篇文章的网页(Boilerpipe值得!)
  2. 一个包含多篇文章的网页,例如纽约时报的头版
  3. 一个网页,其中没有任何文章,但有一些关于链接的内容,但也可能有一定程度的混乱.

Boilerpipe适用于案例#1.但是,如果一个人正在进行大量的自动文本处理,那么一个人的软件如何"知道"它正在处理什么样的网页?如果网页本身可以归类为这三个桶中的一个,那么Boilerpipe可以应用于案例#1.案例#2是一个问题,案例#3也是一个问题 - 它可能需要一组相关的网页来确定什么是混乱和什么不是.