`

使用HtmlParser提取HTML文本块

 
阅读更多

听人介绍说HtmlParser(Java版本)在网页预处理方面做得不错,于是最近几日就研究了一番,虽说没有什么大的收获,但是难得能够让我一个对html标签一无所知的人,认识了其树状结构的玄机,并实现了通过文件目录提取html的标题,关键词,摘要信息,链接及其锚文本,以及主题型网页的正文部分。

以下仅就提取正文部分做个简单拙劣的介绍。在提取网页正文时,对于不同类型的网页应当采用不同的提取策略,而网页又可以分成几种类型呢?粗略地讲,网页就分成两种类型:主题型(topic)和hub型,这种分类有一个明显的差别,即主题型相对hub型网页正文要占可视文本的绝大多数。比如,baidu空间,这种博客类型的网页,多数情况下都是大段大段的文本块,而又如新华网首页,经过分析提取出来1,000多的出链,打开网页映入我们眼帘实际上是这些链接的锚文本。锚文本与正文文本块一个明显的差别就是短小,而门户网站的锚文本又多了一个性质:种类庞杂,条目众多。

基于这种分析,我们在提取网页正文之前,至少在代码中应该定义一个用于判别网页类型的方法/函数,目的就是针对每种类型,采取一种独特的正文提取策略。至于这个功能函数如何实现这种判别,可以参考相关的文献和网络资料具体深入的研究。当然有一种被很多人推崇的版本,那就是计算文本的信噪比,但是这种方法从概念上就足以让人望而却步,更甭提具体实现了,但我觉得可能这种方法也许并没有乍看那么困难吧!先夸下海口,但我还没有抽出足够的时间了解它,以后慢慢地研究吧。我在程序中就采取了一种十分粗糙简化的判别,即通过为网页出链的数目设置一个阈值,当出链数目超出这个阈值时,即可认为该网页属于hub型;低于这个阈值,即被归入主题型网页。明显地,这是一种低级的,没有任何技术含量的假设,还有待我们细化。

网页类型分析出来了,采取什么策略来提取正文呢?还是简化的方式:针对主题型,提取的是主体的大块文本段落;而对hub型,由于其大量的出链和锚文本,我们就直接忽略掉这个提取。说了大半天,竟然没有提取。话虽如此,实际上,hub型网页的文本内容都被我们通过锚文本的形式提取出来了,这也就是我采用HtmlParser提取正文的原因,一方面它可以实现针对性的提取链接,同时跳过script、style、remark标签,过滤掉迷惑性的图片链接等其他链接,单单提取txt/html类型的所有链接,重要的是还能够同时提取相应的锚文本,并能够保存其标签的起始位置。一个让人着迷的实现,从技术上来看,实际上也还是使用我们万能的正则表达式匹配功能实现的,从我来讲,这种匹配只是被包装起来了。其实,我们还是可以让他们pk一下的,比如过滤掉html中的无用标签对以及文本内容,如惹人厌烦的script和style、remark标签:

<1>使用简单的正则表达式匹配:

 public String cleanHtml(String html){
  String regex="<script[\\s\\S]*?</script>" +
    "|<style[\\s\\S]*?</style>"+
    "|<![\\s\\S]*?>";
  Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
  Matcher match=pattern.matcher(html);
  html=match.replaceAll("");
  return html;
 }

输入的是原始的html字符串,输出的结果就将以上垃圾信息过滤掉了 :)

<2>使用HtmlParser过滤script和style标签信息以及文本信息:

 public String htmlInit(String htmlStr){
  NodeFilter scriptFilter=new NodeClassFilter(ScriptTag.class);
  NodeFilter styleFilter=new NodeClassFilter(StyleTag.class);
  NodeFilter[] filter={scriptFilter,styleFilter};
  OrFilter orFilter=new OrFilter(filter);
  try {
   htmlStr=ParserUtils.trimTags(htmlStr,orFilter,true,true);
  } catch (ParserException e) {
   e.printStackTrace();
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
  return htmlStr;
 }

这里使用的OrFilter让人倾倒,本质上无非就是一个数组型的过滤器,实现循环过滤罢了。

 小结:比较起来,从代码量上来看,显然使用正则表达式更为简略,而且实现效果比起后者,过滤的更为彻底。我一直在寻找捷径,其实捷径不一定就是别人走出来的。当然,使用正则表达式的一个缺憾就是损坏了原来html的完整的结构,从而破坏了定位标签位置的实现。还要注意的一点就是,使用Parser.parser(Filter filter)还要初始化parser的编码,以胜任对中文的处理,要知道,它默认的字符编码是ISO-8859-1,在处理中文的时候,如果没有parser.setEncoding("GB2312")这一步,可能看到的是乱码了,或者直接抛出编码转换的错误。

我们多次强调要保存标签位置信息,其实是有目的的,即在完成建立索引,向用户提供查询时,实现关键字飘红或者动态摘要生成的目的。现在,如果采取第一种过滤方式,就使我们丢弃了这种信息,但是还有补救方法,即我们在提供关键字飘红和动态摘要的生成,完全可以基于所有关键字集合来讲,而不是基于全文的。

下面,为了回馈社会,我将前面长篇大论的提取正文信息的代码贴上:

// 提取网页主要文本内容
 public String getContent(){
  content=(isHub())?getHubEntries():getTopicBlock();
  System.out.println("<Content>:");
  System.out.println("=========================");
  System.out.println(content);
  return content;
 }
// 提取Hub类网页文本内容,如yahoo,sina等门户网
 public String getHubEntries(){
  StringBean bean=new StringBean();
  bean.setLinks(false);
  bean.setReplaceNonBreakingSpaces(true);
  bean.setCollapse(true);
  try {
   parser.visitAllNodesWith(bean);
  } catch (ParserException e) {
   System.err.println("getHubEntries()-->"+e);
  }
  parser.reset();
  return bean.getStrings();
 }
 
// 获取主题性(Topical)网页文本内容:对于博客等以文字为主体的网页效果较好
 public String getTopicBlock(){
  
  HasParentFilter acceptedFilter=new HasParentFilter(new TagNameFilter("p"));
  NodeList nodes=null;
  try {
   nodes=parser.extractAllNodesThatMatch(acceptedFilter);
  } catch (ParserException e) {
   System.err.println("getTopicBlock"+e);
  }
  
  StringBuffer sb=new StringBuffer();
  SimpleNodeIterator iter=nodes.elements();
  while(iter.hasMoreNodes()){
   Node node=iter.nextNode();
   sb.append(node.getText()+"\n");
  }
  parser.reset();
  return sb.toString();
 }

说实话,具体效果还真不太好,细节问题还有一箩筐,比如要剔除广告信息怎么处理,如何利用版权声明中的"About us"或者"关于我们"的链接网页,提取信息补充关键词和摘要信息,同时将声明的其余部分毫不保留的过滤掉....

补充说一下,有人提出通过遍历html所有标签,统计其中的文本文字的比特数与标签的比率,根据到达正文尾部可以达到最大化的统计假设来实现,我觉着这种方法也许是正解,慢慢研究咯。

结语:到目前为止,我对HtmlParser的研究还是皮毛,谬误之处多多,还望大虾们多多指教。它让我产生一种冲动,即按照树的结构写出自己的API,努力一把,兴许还真有收获吧!目前正在尝试着搭建一个搜索引擎,学海无涯啊!

分享到:
评论

相关推荐

    java使用htmlparser提取网页纯文本例子

    【Java使用HTMLParser提取网页纯文本】\n\n在Java编程中,提取网页纯文本是一项常见的任务,尤其在数据抓取、信息分析等领域。HTMLParser是一个强大的Java库,专门用于解析HTML文档,提取其中的文本内容。下面我们将...

    HtmlParser提取网页信息的设计与实现

    为了更直观地展示如何使用HtmlParser提取网页信息,下面给出一个简单的示例: 假设我们需要从一个新闻网站的主页上提取所有的新闻标题及其对应的链接。首先,使用HtmlParser解析主页的HTML代码,然后查找所有的`&lt;a&gt;...

    HTMLParser提取网页内容

    可以使用HTMLParser库提供的API来遍历DOM树,查找这些元素并获取其文本内容。 例如,对于标题提取,可以遍历HTML中的所有`&lt;h1&gt;`到`&lt;h6&gt;`标签,然后收集它们的文本;对于正文,可以寻找段落标签或其他可能包含正文...

    Java使用HtmlParser实现简单的网络爬虫

    这里我们使用了HtmlParser库,它是一个开源的Java库,专门用于解析HTML文档,提取和处理网页上的信息。以下是如何使用HtmlParser实现网络爬虫的关键知识点: 1. **HtmlParser库**:HtmlParser是一个强大的HTML解析...

    htmlparser(HTML页面解析)例子

    在本例中,我们将深入探讨如何使用HTMLParser库解析HTML页面,提取所需信息。 首先,我们需要导入Python的`HTMLParser`模块。在Python 3中,这个模块已经被重命名为`html.parser`,因此应该导入`html.parser`,而...

    HTMLParser使用文档和jar包

    使用这个库,开发者可以避免手动解析HTML字符串的繁琐工作,而是通过调用HTMLParser提供的API来解析和操作HTML文档。 HTMLParser的主要特点和功能包括: 1. **错误容忍**:HTMLParser设计时考虑到了HTML的非规范化...

    HTMLParser 使用文档、jar包、以及源码

    1. **例子.txt**:这是一个包含使用HTMLParser库的实际示例代码的文本文件。开发者可以通过阅读和运行这些示例来快速理解如何在自己的项目中应用HTMLParser。 2. **HTMLParser-2.0-SNAPSHOT-doc.zip**:这是...

    htmlparser使用简单讲解

    然后使用`Parser.createParser()`创建一个`Parser`对象,接着使用`visitAllNodesWith()`方法遍历HTML文档的节点,将每个节点传递给`TextExtractingVisitor`,该访问者会提取出HTML中的文本内容。 总的来说,...

    HtmlParser

    总的来说,HTMLParser是Python中实现网络爬虫的关键组件,它使得解析和提取HTML文档内容变得简单。通过合理利用这个工具,我们可以高效地抓取和分析大量网络数据。然而,实际应用中还需要考虑如何处理异步加载的内容...

    JAVA htmlparser 使用实例

    总之,通过以上介绍和示例,我们了解了如何在Java中使用`HtmlParser`库来解析HTML文档,并从中提取所需的信息。这对于开发人员来说是一个非常实用的技能,可以帮助我们在很多场景下更加高效地完成任务。

    htmlparser使用详解

    然而,一旦熟悉了 HTMLParser 的使用,你会发现其设计巧妙且功能强大,能够满足大多数 HTML 解析需求。 在 HTMLParser 中,`org.htmlparser.Parser` 类是核心组件,负责执行 HTML 页面的解析任务。它提供了多种构造...

    c#版htmlparser htmlparser.dll htmlparser源代码

    HTMLParser库提供了便捷的方式来解析复杂的HTML结构,提取所需的数据,而无需关心底层的DOM操作细节。 `htmlparser.dll`是这个库的动态链接库文件,它包含了编译好的类和方法,可以直接在C#项目中引用以使用...

    Html解析助手htmlparser.jar

    例如,你可以使用它来提取网页上的链接、图片、段落文本等信息,或者根据HTML结构自动填充表单。同时,由于它是Java库,所以它可以无缝集成到任何Java项目中,利用Java的强大生态系统。 需要注意的是,尽管`...

    使用HtmlParser

    然而,对于开发者而言,直接处理HTML文本有时是一项挑战,尤其是当需要从中提取特定信息时。HtmlParser是一个强大的Java库,它提供了方便的方式来解析和操作HTML文档。本篇文章将详细介绍如何使用HtmlParser来解析...

    C# HtmlParser使用小实例

    在本文中,我们将深入探讨如何在C#中使用Winista.HtmlParser库进行HTML解析。Winista.HtmlParser是一个轻量级的HTML解析器,适合用于快速提取网页内容,尤其是在开发搜索引擎或者网页爬虫时非常有用。这个小实例包含...

    解析htmlparser的所有jar包

    HTMLParser是一个Java库,专为解析HTML文档而设计。它提供了简单且灵活的方式来处理HTML...有了这个压缩包中包含的所有jar包,你将能够充分利用HTMLParser的功能,无论你是进行简单的文本提取还是复杂的网页处理任务。

    htmlparser.jar文件

    这个库提供了一套API,使得开发者能够方便地遍历、修改或者提取HTML文档中的信息。 在描述中提到的“org.htmlparser.Node”和其他的.class文件,这些都是HTMLParser库的核心组成部分。`org.htmlparser.Node` 是...

    用htmlparser截取html摘要实现源码

    HTMLParser是一个用于解析HTML文档的库,它在Java编程环境中被广泛使用,特别是在处理网页内容时,例如抓取、分析或转换HTML数据。本篇文章将详细介绍如何使用HTMLParser来实现HTML摘要的截取。 首先,我们需要理解...

    htmlparser解析Html的jar包和源文件包(两个)

    - **网页抓取**:在网页抓取或网络爬虫项目中,HTMLParser可以用来提取网页上的链接、文本或特定数据。 - **内容分析**:在文本挖掘或信息检索应用中,HTMLParser可以帮助去除HTML标记,只保留纯文本内容。 - **...

Global site tag (gtag.js) - Google Analytics