`
scottxp
  • 浏览: 3141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

htmlparser 处理<script>标签的一个bug

阅读更多
    众所周知,Htmlparser本身有一些小bug,而且也有三年没更新了。所以现在基于java的信息抽取多转向NekoHtml。不过Htmlparser本身还是有不少优点,主要是扩展性强,其利用的设计模式值得学习。由于时间的关系,现在项目还是使用Htmlparser,以后有时间会对nekohtml进行研究。
    今天遇到的bug来自于对<script>的解析。假如一个网页的部分代码如下,那么HtmlParser是必然会出错的:

<script language="javascript">
var strMsg = "<div aligh=left><span class='font14 style4'><font color=red>******你的投票已提交,谢谢! ******</font></span></div>";
var existStrMsg = "<div aligh=left><span class='font14 style4'><font color=red>******你已经投过票了,谢谢! ******</font></span></div>";
var dealingStrMsg = "<div aligh=left><span class='font14 style4'><font color=red>******正在处理你的投票,请稍后...... ******</font></span></div>";


    htmlparser在解析一个节点时,首先确定节点Tag的类型,然后再调用相应的scanner进一步处理。对于<script>标签,需要调用的就是 org.htmlparser.scanners.ScriptScanner。ScriptScanner的Scan()方法部分代码如下:
public static boolean STRICT = true
...
if (tag instanceof ScriptTag)
        {
            language = ((ScriptTag)tag).getLanguage ();
            if ((null != language) &&
                (language.equalsIgnoreCase ("JScript.Encode") ||
                 language.equalsIgnoreCase ("VBScript.Encode")))
            {
                code = ScriptDecoder.Decode (lexer.getPage (), lexer.getCursor ());
                ((ScriptTag)tag).setScriptCode (code);
            }
        }
        content = lexer.parseCDATA (!STRICT);
        position = lexer.getPosition ();

问题就出在 lexer.parseCDATA() 这个方法上。它提取<scirpt>标签的内容作为文本返回给 content 。当其中的参数为false时,它的截至条件是遇到 “</”。也就是说此时尽管遇到的"</" 是双引号内的文本内容,它仍然会认为遇到了截止标签。对于上文的HTML代码,截止标签就是</font>。出现这个错误后,之后的内容都将被当做html代码来解析,直到再遇到</script>。
    解决的办法很简单 ,只需将参数改为:
content = lexer.parseCDATA (STRICT);

当参数为true时,该方法会自动考虑引号的问题。
分享到:
评论

相关推荐

    html.rar_htmlparser_java parsing html

    &lt;artifactId&gt;htmlparser&lt;/artifactId&gt; &lt;version&gt;最新版本号&lt;/version&gt; &lt;/dependency&gt; ``` 请确保替换`最新版本号`为HTMLParser库的最新稳定版本。 接下来,让我们通过一个简单的示例来了解如何使用HTMLParser解析...

    HTMLParser抽取Web网页正文信息.doc

    例如,如果主题信息主要存在于`&lt;table&gt;`, `&lt;tr&gt;`, `&lt;td&gt;`, `&lt;p&gt;`和`&lt;div&gt;`标签中,你可以创建一个`OrFilter`,结合多个`NodeClassFilter`来筛选这些标签: ```java NodeFilter[] filters = {new NodeClassFilter...

    微信小程序-微信小程序渲染html

    &lt;table&gt;, &lt;tr&gt;, &lt;th&gt;, &lt;td&gt;等表格标签 &lt;a&gt;标签转`` HTML entities 七牛图片裁剪 自定义插件 不支持&lt;form&gt;, ,等表单元素. 使用方法 请参考pages/index目录里的文件. 拷贝html-view目录到你的项目. 在页面的js/...

    HtmlParser的使用

    &lt;groupId&gt;org.htmlparser&lt;/groupId&gt; &lt;artifactId&gt;htmlparser&lt;/artifactId&gt; &lt;version&gt;最新版本号&lt;/version&gt; &lt;/dependency&gt; ``` 请替换“最新版本号”为HTMLParser库的最新稳定版本。 三、基本用法 HTMLParser的...

    java利用htmlparser抓取网页数据

    &lt;groupId&gt;org.htmlparser&lt;/groupId&gt; &lt;artifactId&gt;htmlparser&lt;/artifactId&gt; &lt;version&gt;2.1&lt;/version&gt; &lt;/dependency&gt; ``` 然后,我们可以创建一个Java类来实现网页抓取。以下是一个简单的示例,展示了如何使用...

    htmlparser_Java网页解析器

    &lt;artifactId&gt;htmlparser&lt;/artifactId&gt; &lt;version&gt;2.3&lt;/version&gt; &lt;/dependency&gt; ``` 对于Gradle,则在build.gradle文件中写入: ```groovy implementation 'org.htmlparser:htmlparser:2.3' ``` **7. 注意事项** - ...

    Htmlparser包(带有使用指南和例子)

    &lt;groupId&gt;org.htmlparser&lt;/groupId&gt; &lt;artifactId&gt;htmlparser&lt;/artifactId&gt; &lt;version&gt;版本号&lt;/version&gt; &lt;/dependency&gt; ``` 确保替换“版本号”为你需要的最新版本。 HTMLParser的主要类包括`Parser`,它是整个...

    htmlParser详细文档

    - **过滤脚本和样式**: 在处理&lt;script&gt;和&lt;style&gt;标签的开始事件时,跳过其内容,防止被解析。 5. **文档资源** - `HTMLParser抽取Web网页正文信息.doc`: 这份文档可能详细介绍了如何使用HTMLParser来提取网页正文...

    htmlparser抓取论坛帖子内容的代码

    下面是一个简单的监听器示例,它捕获`&lt;p&gt;`(段落)标签中的文本,代表论坛帖子的主要内容: ```java import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.filters....

    node-htmlparser.zip

    下面是一个简单的示例,展示如何使用node-htmlparser解析HTML并打印出所有的`&lt;p&gt;`标签: ```javascript const htmlparser = require("node-htmlparser"); function parseHTML(html) { const parser = new ...

    HTMLparser 测试代码

    在测试中,我们需要确保此方法能处理相对URL和绝对URL,同时还要考虑没有`href`属性的`&lt;a&gt;`标签,以及可能存在的空链接。 在学习HTMLparser测试代码的过程中,以下是一些关键知识点: 1. **HTML元素选择和遍历**:...

    用htmlparser截取html摘要实现源码

    请注意,这只是一个基础示例,实际应用中可能需要根据网页结构的复杂性进行更复杂的逻辑处理,例如处理嵌套标签、过滤广告或脚本等。此外,对于一些复杂的网页,可能还需要结合其他库(如Jsoup)来增强HTML解析和...

    java解析html工具htmlparser的jar包及api文档

    例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`&lt;a&gt;`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....

    python html parser

    例如,如果你只想处理`&lt;p&gt;`标签,你可以这样做: ```python class ParagraphParser(HTMLParser): def handle_starttag(self, tag, attrs): if tag == 'p': print("Found a paragraph") parser = ParagraphParser...

    使用HtmlParser

    以下代码展示了如何读取一个HTML文件并打印所有的段落(`&lt;p&gt;`标签)内容: ```java import net.htmlparser.jericho.*; public class HtmlParserExample { public static void main(String[] args) { Source ...

    htmlparser使用指南

    总结,HTMLParser是一个强大的HTML处理工具,其简洁的API和事件驱动模型使得处理HTML文档变得轻松。通过熟练掌握HTMLParser,开发者可以更高效地解析、提取和操作HTML数据,从而在Web开发中实现更多功能。

    使用HTMLParser解析网页,找出文章后下载保存

    2. 找到文章内容所在的标签,如`&lt;p&gt;`或`&lt;article&gt;`,并在适当的方法中处理它们。 3. 收集文章文本,并在适当的时候保存到本地文件。 这个过程可能会根据网页结构的不同而有所变化,因此可能需要对解析器进行调整以...

    htmlParser2.0.jar

    1. **HTML标签解析**:HTMLParser2.0能识别并处理HTML文档中的各种标签,如`&lt;div&gt;`, `&lt;p&gt;`, `&lt;a&gt;`等,帮助开发者提取所需信息。 2. **自定义标签处理**:一个独特的特性是它支持处理自定义的HTML标签,这对于解析...

    扩展HTMLParser对自定义标签的处理能力

    资源名称:扩展HTMLParser对自定义标签的处理能力内容简介: HTMLParser是一个用来解析HTML文档的开放源码项目,它具有小巧、快速、使用简单的特点以及拥有强大的功能。 现在该项目的最新版本是Integration Build ...

Global site tag (gtag.js) - Google Analytics