最近写一个小爬虫, 用的htmlparser来解析HTML, 不过, 在解析Object标签时有些不方便,不能准确地拿到子标签对应的理想对象。
下面这样的一段HTML,
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"
height="406" width="980">
<param name="quality" value="high" />
<param name="movie" value="/flash/index.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="movie" value="/flash/index.swf" />
<embed height="406" pluginspage="http://www.macromedia.com/go/getflashplayer"
quality="high" src="/flashRepository/d973f054-ae5d-453d-bbfb-9b9c825fd7df"
type="application/x-shockwave-flash" width="980" wmode="transparent"></embed>
</object>
我用HtmlParser解析后, 可以成功地拿到Object标签对应的对象, 可再往下就拿不到了, Param和Embed标签都是TagNode类型的, 而不是我想要的ParamTag和EmbedTag,这两个类的实现在下面, 是我自己定义的。
解析的代码是这样的:
PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
factory.registerTag(new LocalObjectTag());
factory.registerTag(new EmbedTag());
factory.registerTag(new ParamTag());
Parser parser = new Parser();
parser.setNodeFactory(factory);
try {
parser.setInputHTML(testHTML);
} catch (ParserException e) {
e.printStackTrace();
}
parser.setFeedback(new DefaultParserFeedback(DefaultParserFeedback.QUIET));
NodeFilter[] srcFilters = { new NodeClassFilter(EmbedTag.class),
new NodeClassFilter(LocalObjectTag.class),new NodeClassFilter(ParamTag.class) };
OrFilter linkFilter = new OrFilter(srcFilters);
// 得到所有经过过滤的标签
try {
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node n = list.elementAt(i);
if (n instanceof ParamTag) {
ParamTag p = (ParamTag) n;
System.out.println("src: " + p.getSrc());
}
}
} catch (ParserException e) {
e.printStackTrace();
}
System.out.println("exit");
由于Parser里没有自带的EmbedTag和ParamTag, 我自写了这两个类。
public class ParamTag extends CompositeTag {
public String getSrc() {
String result = null;
//先看data属性里有没有值。
String srcValue = getAttribute("SRC");
if (StringUtils.isNotBlank(srcValue)) {
return getPage ().getAbsoluteURL (srcValue);
}
return result;
}
public boolean isMovie() {
return null != getAttribute("MOVIE");
}
}
public class EmbedTag extends CompositeTag {
public String getSrc() {
String result = null;
//先看data属性里有没有值。
String srcValue = getAttribute("SRC");
if (StringUtils.isNotBlank(srcValue)) {
return getPage ().getAbsoluteURL (srcValue);
}
return result;
}
}
另, 为了方便地使用ObjectTag, 我又继承了下, 搞了个新类LocalObjectTag。
public class LocalObjectTag extends ObjectTag {
public String extractUrl() {
String result = null;
//先看data属性里有没有值。
String dataValue = getAttribute("data");
if (StringUtils.isNotBlank(dataValue)) {
return getPage ().getAbsoluteURL (dataValue);
}
result = fromChildren();
if (StringUtils.isNotBlank(result)) {
return result;
}
return result;
}
private String fromChildren() {
String result = null;
NodeList nList = this.getChildren();
for(int i=0;i<nList.size();i++) {
Node n = nList.elementAt(i);
if (n instanceof TagNode) {
TagNode tNode = (TagNode)n;
String value = tNode.getAttribute("VALUE");
String nameAttri = tNode.getAttribute("name");
if (StringUtils.isNotBlank(value) && "movie".equalsIgnoreCase(nameAttri)) {
return value;
}
String src = tNode.getAttribute("src");
String name = tNode.getTagName();
if (StringUtils.isNotBlank(src) && "embed".equalsIgnoreCase(name)) {
return src;
}
}
}
return result;
}
}
在解析前, 我用这样的设置
PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
factory.registerTag(new LocalObjectTag());
factory.registerTag(new EmbedTag());
factory.registerTag(new ParamTag());
光这样还不够? 请问还需要有什么特殊设置么?
分享到:
相关推荐
例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`<a>`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....
在使用HTMLParser时,首先需要创建一个`Parser`对象。可以通过传递一个`URLConnection`对象来构造`Parser`,这样可以从网络获取HTML内容。例如: ```java URL url = new URL("http://example.com"); URLConnection ...
- **事件驱动的解析模型**:通过监听器模式,用户可以注册事件处理器,当解析到特定标签、文本或其他元素时触发回调。 - **DOM树构建**:HTMLParser可以构建一个DOM树表示HTML文档,方便进行结构化查询和操作。 - ...
除了基础的开始标签、结束标签和文本数据处理外,HTMLParser还支持处理实体(entities)和属性值。例如,通过重写`handle_entityref`和`handle_charref`可以处理HTML实体,如`&`(代表`&`)和`<`(代表`)。...
- HTMLParser不支持XML,如果你需要解析XML文档,应使用`xml.parsers.expat`库。 - 解析过程中,需注意内存管理和性能优化,尤其是处理大型HTML文档时。 通过阅读上述文章(链接:...
1. **导入库**:在Java项目中,首先需要将`htmlparser.jar`添加到类路径中,以便能够使用其提供的类和方法。 2. **创建解析器**:通过实例化解析器类,如`HtmlParser`,并设置相应的解析模式和配置。 3. **解析HTML*...
3. **标签和属性处理**:HTMLParser能处理不规范的HTML,因为它设计时考虑到了HTML的非结构化特性。它可以识别并处理标签的嵌套、未闭合的标签以及不正确的属性值。 4. **过滤和转换**:你可以通过自定义处理器或...
总结来说,使用HTMLParser解析网页涉及到以下步骤: 1. 继承`HTMLParser`并重写相关方法以定义解析逻辑。 2. 找到文章内容所在的标签,如`<p>`或`<article>`,并在适当的方法中处理它们。 3. 收集文章文本,并在适当...
使用HTMLParser,我们可以解析网页内容,提取所需信息,如文章标题、链接、图片等。以下是一些核心概念和步骤: 1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_...
在事件驱动模式下,HTMLParser会监听并触发一系列的解析事件,如遇到开始标签、结束标签、文本内容等。开发者可以通过注册事件处理器来响应这些事件,从而提取所需的数据。这种方式对于处理大量HTML文档且只需要关注...
最后,我们使用 InputStreamReader 对象来读取网页的内容,并使用 HTMLParser 来解析网页。 HTMLParser 是一个功能强大且灵活的类库,用于解析和处理网页内容。它提供了多种使用方式和机制,适合不同的应用场景。
在浏览器加载HTML文档时,它会使用内置的解析器来解析这些标签,并根据它们构建DOM(文档对象模型)树,这个过程就是HTML解析。 HTMLParser是实现这个解析过程的软件组件。它的主要任务包括识别HTML标记、处理嵌套...
资源名称:扩展HTMLParser对自定义标签的处理能力内容简介: HTMLParser是一个用来解析HTML文档的开放源码项目,它具有小巧、快速、使用简单的特点以及拥有强大的功能。 现在该项目的最新版本是Integration Build ...
4. **事件驱动的解析**:HTMLParser.net提供了一个事件模型,当解析到特定元素或属性时,会触发事件。开发者可以订阅这些事件来实现自定义逻辑。 5. **灵活性**:除了基本的HTML解析,HTMLParser.net还支持XML和SVG...
因为一个项目需要解析一个网站上的新闻,所以找到了htmlParser这个开源的项目,删除了一些不需要的包,使其可以在android上用。 有两个工程,myhtml是库,要把它包含到dwParser(android工程)工程中,就可以直接...
htmlparser解析html,获得需要的字段
通过这个教程,开发者可以掌握HTMLParser的基本使用方法,从而有效地从网页中抓取和解析数据。实际应用中,HTMLParser常与网络请求库(如Apache HttpClient或OkHttp)结合使用,以获取远程网页内容,再进行后续的...
例如,可以先用`requests`获取网页源码,然后使用`htmlParser`解析HTML,提取所需信息,最后可能再用`pandas`存储和分析数据。 总结来说,`htmlParser`是一个强大且易用的HTML解析工具,它通过事件驱动的方式让...
HTMLParser提供了多种方法来访问和操作解析树,比如`parseContent()`用于获取整个文档的节点列表,`visitAllNodesWith()`可以遍历所有节点并应用自定义的访问器,`getFirstNodeWithTag()`用于找到第一个特定标签的...
标题已经哼明白了,这里下载下来作为library引入即可。 这里是jar下载:http://sourceforge.net/projects/htmlparser/ (ps:不过导入jar前,要重新编译jar,要不在Android工程了不可用)