使用Filter抓取页面Tag--HTMLParser

在之前的文章中提到使用两个Filter是不能得到预想中的结果的,而只能得到第一个Filter的结果,但是还有一个OrFilter,可以将几个Filter联合起来,获得需要的Tag。而且这些Filter可以用AndFilter联合几个属性,以抓取特定的Tag。实例如下:
NodeFilter[] filterArray = {
                new AndFilter(new TagNameFilter("a"), new HasAttributeFilter(
                        "href")),
                new AndFilter(new TagNameFilter("form"),
                        new HasAttributeFilter("action")),
                new AndFilter(new TagNameFilter("frame"),
                        new HasAttributeFilter("src")),
                new AndFilter(new TagNameFilter("iframe"),
                        new HasAttributeFilter("src")), };
NodeFilter filter = new OrFilter(filterArray);
这样就可以抓取特定的Tag,我们所需要的。
在建立HTMLParser实例之后,使用parser.extractAllNodesThatMatch(filter);获取一个NodeList,然后从中取出每个Node,具体操作。
if (tag instanceof LinkTag){
    操作
}else if(tag instanceof FormTag){
    操作
}else if(tag instanceof FrameTag){
    操作
}else{
    if (tag.getName().toLowerCase().equals("iframe")){
       操作
    }
}
这里注意,没有IFrameTag,你可以自己去扩展,但是我当时按照FrameTag写一个IFrameTag出来,强制想要将tag转换为IFrameTag的时候,出现了Cast错误。当然,现在这样也能解决问题,但是对于FormTag,没有办法从这个FormTag中得到里边的SelectTag,这样在分析form的时候总是有很多不便的。
 

你可能感兴趣的:(使用Filter抓取页面Tag--HTMLParser)