日期:2014-05-20  浏览次数:20728 次

htmlparser使用上的一些小疑问
还记得一年前对网页抓取感兴趣,自己写正则抓取什么网页链接,图片链接之类的,都是用的纯java se的东西,当年有个叫huner的兄弟就推荐我用htmlparser来搞,可惜自己水平不够,完全不知道咋用,一年后水平略有上升,终于能使用的比较顺手了,学习的历程啊。。。

使用中有几个小问题,不知道htmlparser本身有没有提供一些解决办法?话说API这东西不好搞啊,能读懂,但就是找不到自己需要的解决办法在哪,真是愁啊。。。特此找各位高人询问下解决思路

1、htmlparser没有对提取到的节点做排重,不知道有没有方法可以实现?比如我添加了2个<a href=www.csdn.net>csdn</a>就会都抓取下来,使用的代码
Java code

Parser parser = Parser.createParser("http://www.xxx.com");
NodeFilter filterA = new TagNameFilter("a");
NodeList nodes = parser.extractAllNodesThatMatch(filterA);
for (int i = 0; i < nodes.size(); i++) 
{
        Node textnode = (Node) nodes.elementAt(i);
System.out.println("toHtml:"+textnode.toHtml());

                }


本来按照思路应该是在extractAllNodesThatMatch这个方法里添加一个true之类的,但是也没找到,不知道有没有其他的方法排重,当然我也不是没想过,把提取出来的放到hashset在遍历拿出来,不过感觉有点麻烦

2、比较郁闷的StringFilter一直都以为是能过滤我抓取下来的所有node节点里包含的字符串,结果试了半天终于发现原来是过滤节点中间的内容的,比如:<a href="www.baidu.com">百度</a>,如果这么写
NodeFilter filterB = new StringFilter("www.baidu.com");肯定是抓取不到的,只能写
NodeFilter filterB = new StringFilter("百度");
有没有方法能过滤节点属性呢?我现在只能使用if(oldSrcPath.contains("baidu"))这么过滤,不知道有没有其他的方法

以上2个问题如果都能用htmlparser本身的方法解决请各位不吝指教,最好能说说咋在APi中找到这些方法的?经验?技巧?

------解决方案--------------------
jsoup 易用。
类似css/jquery的 selector非常方便。而且实现了 Iterable接口,遍历也方便。