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

时间:2011-08-11 05:36:14

标签: java html 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

9 个答案:

答案 0 :(得分:22)

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

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

你可以use a URL

ArticleExtractor.INSTANCE.getText(url);

你可以use a String

ArticleExtractor.INSTANCE.getText(myHtml);

还有use a Reader的选项,可以打开大量选项。

答案 1 :(得分:7)

您还可以使用boilerpipe 文本分段为全文/非全文块,而不是只返回其中一个(实际上,首先是samppipe段,然后返回一个String)。

假设您可以从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
}

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

答案 2 :(得分:5)

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

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

  1. 一个网页,里面有一篇文章(Boilerpipe值得!)
  2. 包含多篇文章的网页,例如纽约时报的头版
  3. 一个网页,其中没有任何文章,但有一些关于链接的内容,但也可能有一定程度的混乱。
  4. Boilerpipe适用于案例#1。但如果一个人正在进行大量的自动文本处理,那么他们的软件如何知道"它正在处理什么样的网页?如果网页本身可以归类为这三个桶中的一个,那么Boilerpipe可以应用于案例#1。案例#2是一个问题,案例#3也是一个问题 - 它可能需要一组相关的网页来确定什么是混乱和什么不是。

答案 3 :(得分:1)

您可以使用goose之类的某些库。它最适用于文章/新闻。 您还可以使用readability bookmarklet

检查与goose进行类似提取的javascript代码

答案 4 :(得分:1)

我的第一直觉是使用您使用Jsoup的初始方法。至少可以使用选择器并仅检索所需的元素(即Elements posts = doc.select("p");,而不必担心具有随机内容的其他元素。

关于你的另一篇文章,误报的问题是你偏离Jsoup的唯一理由吗?如果是这样,你不能只调整MIN_WORDS_SEQUENCE的数量或者选择器的选择性更强(即不检索div元素)

答案 5 :(得分:1)

http://kapowsoftware.com/products/kapow-katalyst-platform/robo-server.php

专有软件,但它可以很容易地从网页中提取并与java很好地集成。

您使用提供的应用程序设计roboserver api读取的xml文件以解析网页。 xml文件是通过分析您希望在提供的应用程序中解析的页面(相当简单)并应用收集数据的规则(通常,网站遵循相同的模式)构建的。您可以使用提供的Java API设置调度,运行和数据库集成。

如果您反对使用软件并自行完成,我建议不要尝试将1规则应用于所有网站。找到一种分隔标签然后构建每个站点的方法

答案 6 :(得分:0)

您正在寻找所谓的“HTML抓取工具”或“屏幕抓取工具”。以下是一些指向您的选项的链接:

Tag Soup

HTML Unit

答案 7 :(得分:0)

您可以过滤html垃圾,然后解析所需的详细信息或使用现有网站的api。 请参考以下链接过滤html,我希望它有所帮助。 http://thewiredguy.com/wordpress/index.php/2011/07/dont-have-an-apirip-dat-off-the-page/

答案 8 :(得分:0)

您可以使用textracto api,它会提取主要文章'文本,还有机会提取所有其他文本内容。通过减去'这些文本可以从主要文本内容中分割导航文本,预览文本等。