`
scottxp
  • 浏览: 3168 次
  • 性别: 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...

    JAVA htmlparser 使用实例

    &lt;artifactId&gt;htmlparser&lt;/artifactId&gt; &lt;version&gt;2.0&lt;/version&gt; &lt;/dependency&gt; ``` 如果是Gradle项目,则在`build.gradle`文件中添加如下依赖: ```groovy dependencies { implementation '...

    HTMLParser抽取Web网页正文信息

    例如,如果我们关注的是`&lt;table&gt;`、`&lt;tr&gt;`、`&lt;td&gt;`、`&lt;p&gt;`和`&lt;div&gt;`等标签,可以创建一个`NodeFilter`数组,并使用`OrFilter`组合多个过滤条件: ```java NodeFilter[] filters = {new NodeClassFilter(TableTag....

    微信小程序-微信小程序渲染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提取网页内容

    HTMLParser 是一个用于解析HTML文档的Java库,它允许开发者以结构化的方式处理网页内容,例如提取特定元素、过滤不需要的标签等。在Web抓取或数据挖掘领域,HTMLParser是一个常用的工具,可以帮助我们从HTML源码中...

    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`,它是整个...

    python爬虫必备BeatifulSoup4

    soup.p # 返回第一个&lt;p&gt;标签 soup.p['class'] # 返回&lt;p&gt;标签的class属性值 soup.a # 返回所有&lt;a&gt;标签 soup.find_all('a') # 返回包含所有&lt;a&gt;标签的列表 ``` 这些方法提供了对文档结构的直观访问,极大地简化了数据...

    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元素选择和遍历**:...

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

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

    用htmlparser截取html摘要实现源码

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

    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...

Global site tag (gtag.js) - Google Analytics