org.htmlparser 主要用来解析HTML网页。
一、基本上HTML中的每个标签对应于一个类,例如:
p标签对应于ParagraphTag类
ul标签对应于BulletList类
li标签对应于Bullet类
a标签对应于LinkTag类
文本对应于TextNode类
span标签对应于Span类
div标签对应于Div类
等等。
二、包含多种类型的HTML过滤器,例如:
1、属性过滤器,例如查询id=‘123’的标签
HasAttributeFilter answerFilter = new HasAttributeFilter("id","123");
2、样式过滤器,例如查询class='entry-text'的div标签
CssSelectorNodeFilter answerFilter = new CssSelectorNodeFilter("div[class='entry-text']");
3、标签名过滤器,例如查询所有的h2标签
TagNameFilter h2TagName_list = new TagNameFilter("h2");
4、父节点过滤器,例如查询父节点符合h2TagName_list过滤器的所有标签,第二个参数表示是否递归,true表示递归查找,即父、父父、父父父、依次向上查找。
HasParentFilter hasParentOfLi_list = new HasParentFilter(h2TagName_list,true);
5、并 过滤器,即查询同时满足多个过滤器的标签
AndFilter listFilter = new AndFilter(new NodeFilter[]{过滤器1,过滤器2,过滤器3,.....});
6、或者 过滤器,即查询满足其中任何一个过滤器的标签
OrFilter answerFilter = new OrFilter(过滤器1, 过滤器2);
7、标签类过滤器,即查询这一类的标签
NodeClassFilter textFilter_detail = new NodeClassFilter(TextNode.class);
8、文本过滤器,即查询包含这一文本内容的所有文本标签
StringFilter stringOf10WhyFilter_detail = new StringFilter("hello");
9、不 过滤器,即查询不符合该过滤器的所有标签
NotFilter notStringOf10WhyFilter_detail = new NotFilter(过滤器1);
10、 LinkStringFilter,这个Filter用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接
NodeFilter filter = new LinkStringFilter("www.baizeju.com");
等等
三、对获取到的网页内容进行解析
NodeList questionNodeList = new Parser(content).parse(questionFilter);
其中content表示网页内容,字符串类型;
questionFilter表示过滤器,即在网页字符串中查找符合该过滤器的所有标签。
对于有些网页的解析可能会报如下错误:
org.htmlparser.util.ParserException: Error in opening a connection to java.io.IOException: Invalid argument.......
解决方法如下:
/** * 解析字符串 * @param inputHTML String * @return Parser */ public static Parser createParser(String inputHTML) { Lexer mLexer = new Lexer(new Page(inputHTML)); return new Parser(mLexer,new DefaultParserFeedback(DefaultParserFeedback.QUIET)); }
而上面的new Parser(content).parse(questionFilter);语句改成myParser = createParser(content).parse(questionFilter);就行了