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

2022-09-02 00:59:22

更新

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

因此,如果API这样做,请以某种不同于单个文本的方式获取不同的文本部分/块(仅在一个文本中全部没有用),请报告。


问题

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

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

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

以此页面为例,我不希望上面的菜单和页脚中的链接。

重要:所有页面都是HTML,并且是来自各种不同站点的页面。我需要有关如何排除这些内容的建议。

目前,我认为从HTML中排除“菜单”和“横幅”类中的内容以及看起来像专有名称(第一个大写字母)的连续单词。

解决方案可以基于文本内容(没有HTML标签)或HTML内容(带有HTML标签)

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

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


答案 1

看看锅炉管。它旨在完全按照您的要求,消除网页主要文本内容周围多余的“杂乱”(样板,模板)。

有几种方法可以将HTML输入到Boilerpipe并提取HTML。

您可以使用网址

ArticleExtractor.INSTANCE.getText(url);

您可以使用字符串

ArticleExtractor.INSTANCE.getText(myHtml);

还有一些选项可以使用阅读器,这打开了大量的选项。


答案 2

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

假设您可以从java.io.Reader访问HTML,只需让锅炉管对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有一些比较刺激的方法,随意玩一玩!