最近写一个小爬虫, 用的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());
光这样还不够? 请问还需要有什么特殊设置么?
分享到:
相关推荐
在使用Winista.HtmlParser时,首先需要导入插件并实例化解析器。之后,通过调用解析方法,将HTML文本转换为树形结构的节点集合。这些节点代表了HTML文档的各个部分,包括元素节点、文本节点和注释节点等。开发者可以...
使用HtmlParser解析HTML文档,可以通过创建`HtmlParser`对象并调用其`parse`方法完成。 2. **提取所需信息:** 通过HtmlParser提供的各种过滤器和访问者模式,可以从解析后的HTML文档中抽取所需的信息。 3. **...
HTMLParser 是一个用纯 Java 编写的库,专门用于解析和处理HTML文档。它不依赖任何其他Java库,使得它成为一个轻量级且独立的解决方案。HTMLParser 的设计旨在高效、稳定地解析HTML,即使面对格式不规范或复杂的网页...
在这个过程中,可能还会涉及一些关键的代码逻辑,例如使用`for`循环遍历HTML节点,通过条件判断选择需要的节点,以及使用`Parser`对象的`parse()`方法进行实际的解析工作。 通过这样的设计,你可以实现一个完整的...
1. **HTML清理与标准化**:HtmlCleaner通过解析HTML文档并将其转换为干净的DOM(文档对象模型)树,可以去除广告、脚本、样式表等非正文内容,同时修复不规范的HTML标签,使文档结构更加规整。 2. **标签过滤与替换...