HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容

htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0

下载地址http://sourceforge.net/projects/htmlparser/ 

在线APIhttp://www.ostools.net/apidocs/apidoc?api=HTMLParser

Filter就是对于结果进行过滤,取得需要的内容。HTMLParserorg.htmlparser.filters包之内一共定义了15个不同的Filter

AndFilter、CssSelectorNodeFilter、HasAttributeFilter、HasChildFilter、HasSiblingFilter、IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、NotFilter、OrFilter、RegexFilter、StringFilter 、TagNameFilter.

常用的几个过滤器说明 

TagNameFilter:   
是最容易理解的一个Filter,根据Tag的名字进行过滤

HasChildFilter: 
是返回有符合条件的子节点的节点,需要另外一个Filter作为过滤子节点的参数。

HasAttributeFilter:
可以匹配出包含制定名字的属性,或者制定属性为指定值的节点。HasParentFilter和HasSiblingFilter的功能与HasChildFilter类似。

StringFilter:    
这个Filter用于过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

RegexFilter :   
根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

NodeClassFilter: 
根据已定义的标签类获取节点

LinkStringFilter:
这个Filter用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接。

OrFilter:  
是结合几种过滤条件的'或'过滤器 

AndFilter:     
是结合几种过滤条件的'与'过滤器

实例应用

NodeClassFilter过滤器实例

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

程序运行结果:
HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容_第1张图片


TagNameFilter实例应用
是最容易理解的一个Filter,根据Tag的名字进行过滤

复制代码
    /** * * 根据标签名过滤页面中的标签信息 * * @param url 要解析的url页面 * @param encoding 使用的字符编码 * @param tagName 标签名 */
    public static void nodeFilterTagName(String url,String encoding,String tagName){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //过滤页面中的链接标签
            NodeFilter filter = new TagNameFilter(tagName); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //获取页面中的<a href='xxx' [属性]>格式的链接
        nodeFilterTagName(url, "UTF-8", "a"); //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
        nodeFilterTagName(url, "UTF-8", "img"); //获取页面中的<div>链接 //nodeFilterTagName(url, "UTF-8", "div");
 }
复制代码

程序运行结果同上

StringFilter实例应用
过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

复制代码
    /** * 过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示 * * @param url 请求处理的url * @param encoding 字符编码 * @param containStr包含的指定内容 */
    public static void stringFilter(String url,String encoding,String containStr){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new StringFilter(containStr); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; stringFilter(url, "UTF-8", "img.baidu.com"); }
复制代码

程序运行结果

HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容_第2张图片



OrFilter实例应用
OrFilter是结合几种过滤条件的‘或’过滤器,与此相反的是AndFilter,AndFilter是集合几个过滤条件的‘与’过滤器

复制代码
    /** * OrFilter是结合几种过滤条件的‘或’过滤器 * * 一般主题信息包含在下列标签中:<table>、<tr>、<td>、<p>、<div>等。如果要过滤出这些节点标签,可以使用OrFilter过滤器 * * @param url 请求处理的url * @param encoding 使用的字符编码 * @param filters 多个过滤器数组 */
    public static void orMultiFilter(String url,String encoding,NodeFilter[] filters){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new OrFilter(filters); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //过滤多个标签 或关系
        NodeFilter[]  filters = new NodeFilter[3]; filters[0] = new NodeClassFilter(TableTag.class); filters[1] = new NodeClassFilter(ParagraphTag.class); filters[2] = new NodeClassFilter(ImageTag.class); orMultiFilter(url, "UTF-8", filters); }
复制代码

程序运行结果:

HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容_第3张图片


RegexFilter与LinkRegexFilter实例应用
RegexFilter根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

复制代码
    /** * 在文本中通过正则进行匹配 * * @param url 请求处理的url * @param encoding 字符编码 * @param regex 待匹配的正则表达式 */
    public static void regexStringFilter(String url,String encoding,String regex){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new RegexFilter(regex); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } /** * 在链接地址中进行正则匹配,返回的是Link结点 * * @param url 请求url * @param encoding 字符编码 * @param regex 待匹配的正则表达式 */
    public static void linkTagRegexFilter(String url,String encoding,String regex){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new LinkRegexFilter(regex); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url =  "F:/dennisit/email.txt"; String emailRegex = "[a-zA-Z0-9_-]+@\\w+\\.[a-z]+(\\.[a-z]+)?"; regexStringFilter(url, "UTF-8", emailRegex); System.out.println("-------------------------------------------"); linkTagRegexFilter(url, "UTF-8", emailRegex); }
复制代码

程序运行结果
HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容_第4张图片

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3191803.html]

你可能感兴趣的:(HtmlParser)