众所周知,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时,该方法会自动考虑引号的问题。
分享到:
相关推荐
<artifactId>htmlparser</artifactId> <version>最新版本号</version> </dependency> ``` 请确保替换`最新版本号`为HTMLParser库的最新稳定版本。 接下来,让我们通过一个简单的示例来了解如何使用HTMLParser解析...
例如,如果主题信息主要存在于`<table>`, `<tr>`, `<td>`, `<p>`和`<div>`标签中,你可以创建一个`OrFilter`,结合多个`NodeClassFilter`来筛选这些标签: ```java NodeFilter[] filters = {new NodeClassFilter...
<artifactId>htmlparser</artifactId> <version>2.0</version> </dependency> ``` 如果是Gradle项目,则在`build.gradle`文件中添加如下依赖: ```groovy dependencies { implementation '...
例如,如果我们关注的是`<table>`、`<tr>`、`<td>`、`<p>`和`<div>`等标签,可以创建一个`NodeFilter`数组,并使用`OrFilter`组合多个过滤条件: ```java NodeFilter[] filters = {new NodeClassFilter(TableTag....
<table>, <tr>, <th>, <td>等表格标签 <a>标签转`` HTML entities 七牛图片裁剪 自定义插件 不支持<form>, ,等表单元素. 使用方法 请参考pages/index目录里的文件. 拷贝html-view目录到你的项目. 在页面的js/...
<groupId>org.htmlparser</groupId> <artifactId>htmlparser</artifactId> <version>最新版本号</version> </dependency> ``` 请替换“最新版本号”为HTMLParser库的最新稳定版本。 三、基本用法 HTMLParser的...
<groupId>org.htmlparser</groupId> <artifactId>htmlparser</artifactId> <version>2.1</version> </dependency> ``` 然后,我们可以创建一个Java类来实现网页抓取。以下是一个简单的示例,展示了如何使用...
<artifactId>htmlparser</artifactId> <version>2.3</version> </dependency> ``` 对于Gradle,则在build.gradle文件中写入: ```groovy implementation 'org.htmlparser:htmlparser:2.3' ``` **7. 注意事项** - ...
HTMLParser 是一个用于解析HTML文档的Java库,它允许开发者以结构化的方式处理网页内容,例如提取特定元素、过滤不需要的标签等。在Web抓取或数据挖掘领域,HTMLParser是一个常用的工具,可以帮助我们从HTML源码中...
<groupId>org.htmlparser</groupId> <artifactId>htmlparser</artifactId> <version>版本号</version> </dependency> ``` 确保替换“版本号”为你需要的最新版本。 HTMLParser的主要类包括`Parser`,它是整个...
soup.p # 返回第一个<p>标签 soup.p['class'] # 返回<p>标签的class属性值 soup.a # 返回所有<a>标签 soup.find_all('a') # 返回包含所有<a>标签的列表 ``` 这些方法提供了对文档结构的直观访问,极大地简化了数据...
- **过滤脚本和样式**: 在处理<script>和<style>标签的开始事件时,跳过其内容,防止被解析。 5. **文档资源** - `HTMLParser抽取Web网页正文信息.doc`: 这份文档可能详细介绍了如何使用HTMLParser来提取网页正文...
下面是一个简单的监听器示例,它捕获`<p>`(段落)标签中的文本,代表论坛帖子的主要内容: ```java import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.filters....
下面是一个简单的示例,展示如何使用node-htmlparser解析HTML并打印出所有的`<p>`标签: ```javascript const htmlparser = require("node-htmlparser"); function parseHTML(html) { const parser = new ...
在测试中,我们需要确保此方法能处理相对URL和绝对URL,同时还要考虑没有`href`属性的`<a>`标签,以及可能存在的空链接。 在学习HTMLparser测试代码的过程中,以下是一些关键知识点: 1. **HTML元素选择和遍历**:...
例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`<a>`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....
请注意,这只是一个基础示例,实际应用中可能需要根据网页结构的复杂性进行更复杂的逻辑处理,例如处理嵌套标签、过滤广告或脚本等。此外,对于一些复杂的网页,可能还需要结合其他库(如Jsoup)来增强HTML解析和...
例如,如果你只想处理`<p>`标签,你可以这样做: ```python class ParagraphParser(HTMLParser): def handle_starttag(self, tag, attrs): if tag == 'p': print("Found a paragraph") parser = ParagraphParser...