HTMLParser는 웹페이지의 콘텐츠를 순회한 후 결과를 트리(포리스트) 구조로 저장합니다. HTMLParser가 결과 콘텐츠에 액세스하는 방법에는 두 가지가 있습니다. 필터를 사용하고 방문자를 사용하십시오.
(1) 필터 클래스
이름에서 알 수 있듯이 필터는 결과를 필터링하고 필요한 콘텐츠를 얻는 것입니다. HTMLParser는 org.htmlparser.filters 패키지에 총 16개의 서로 다른 필터를 정의하며, 이 필터는 여러 범주로 나눌 수도 있습니다.
판단 클래스 필터:
TagNameFilter HasAttributeFilter HasChildFilter HasParentFilter HasSiblingFilter IsEqualFilter
논리 연산 필터:
AndFilter NotFilter OrFilter XorFilter 其他Filter: NodeClassFilter StringFilter LinkStringFilter LinkRegexFilter RegexFilter CssSelectorNodeFilter
모든 필터 클래스는 org.htmlparser.NodeFilter 인터페이스를 구현합니다. 이 인터페이스에는 단 하나의 주요 기능이 있습니다:
boolean accept (Node node);
(2) 판단 클래스 FilterHTMLParser 시작하기 (2) - 노드 콘텐츠, 가져오기 부분을 직접 추가)
public static void main(String[] args) { try{ Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() ); // 这里是控制测试的部分,后面的例子修改的就是这个地方。 NodeFilter filter = new TagNameFilter ("DIV"); NodeList nodes = parser.extractAllNodesThatMatch(filter); if(nodes!=null) { for (int i = 0; i < nodes.size(); i++) { Node textnode = (Node) nodes.elementAt(i); message("getText:"+textnode.getText()); message("================================================="); } } } catch( Exception e ) { e.printStackTrace(); } }
출력 결과:
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
파일의 두 Div 노드가 모두 제거된 것을 확인할 수 있습니다. 두 개의 DIV 노드에서 다음 작업을 수행할 수 있습니다
2.2 HasChildFilter
HasChildFilter를 살펴보겠습니다. 방금 이 필터를 봤을 때 이 필터가 Child가 포함된 태그를 반환한다는 것을 당연하게 여겼습니다.
NodeFilter filter = new HasChildFilter();
직접 초기화 코드 수정:
NodeFilter innerFilter = new TagNameFilter ("DIV"); NodeFilter filter = new HasChildFilter(innerFilter); NodeList nodes = parser.extractAllNodesThatMatch(filter);
출력 결과:
getText:body ================================================= getText:div id="top_main" =================================================
보시다시피 , 출력은 DIV 하위 태그가 있는 두 개의 태그 노드입니다. (본문에는 하위 노드 DIV "top_main"이 있고 "top_main"에는 하위 노드 "logoindex"가 있습니다.
HasChildFilter에도 생성자가 있습니다.
public HasChildFilter (NodeFilter filter, boolean recursive)
recursive가 false인 경우 첫 번째 수준 하위 노드만 필터링됩니다. 예를 들어 이전 예에서 body와 top_main 모두 첫 번째 수준 하위 노드에 DIV 노드가 있으므로 다음을 사용하면 일치합니다. 다음 방법:
NodeFilter filter = new HasChildFilter( innerFilter, true );
출력 결과:
getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText:body ================================================= getText:div id="top_main" =================================================
추가 html xmlns="http:// www.w3.org/1999/xhtml", 이는 전체 HTML 페이지의 노드(루트 노드)입니다. 이 노드 바로 아래에 DIV 노드가 없지만 하위 노드 본문 아래에 DIV 노드가 있으므로
2.3 HasAttributeFilter
HasAttributeFilter에는 3개의 생성자가 있습니다:
public HasAttributeFilter (); public HasAttributeFilter (String attribute); public HasAttributeFilter (String attribute, String value);
이 필터는 지정된 이름을 포함하는 속성 또는 지정된 속성을 가진 노드와 일치할 수 있습니다.
호출 방법 1:
NodeFilter filter = new HasAttributeFilter(); NodeList nodes = parser.extractAllNodesThatMatch(filter);
출력 결과:
什么也没有输出。
호출 방법 2:
NodeFilter filter = new HasAttributeFilter( "id" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
출력 결과:
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
호출 방법 3:
NodeFilter filter = new HasAttributeFilter( "id", "logoindex" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
출력 결과:
getText:div id="logoindex" =================================================
아주 간단합니다 ㅎㅎ
2.4 기타 판단 열 Filter
HasParentFilter 및 HasSiblingFilter의 기능은 HasChildFilter와 유사합니다. . 직접 해보시고 이해하셔야 합니다.
IsEqualFilter의 매개변수는 노드입니다:
public IsEqualFilter (Node node) { mNode = node; } accept函数也很简单: public boolean accept (Node node) { return (mNode == node); }
테스트 코드:
출력 결과:
NodeFilter filter = new NodeClassFilter(RemarkNode.class); NodeList nodes = parser.extractAllNodesThatMatch(filter);
4.2 StringFilter
getText:这是注释 ================================================= 可以看到只有RemarkNode(注释)被输出了。
테스트 코드:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-title-www.baizeju.com</title></head> <html xmlns="http://www.w3.org/1999/xhtml"> <body > <div id="top_main"> <div id="logoindex"> <!--这是注释 白泽居-www.baizeju.com --> 白泽居-字符串1-www.baizeju.com <a href="http://www.baizeju.com">白泽居-链接文本-www.baizeju.com</a> </div> 白泽居-字符串2-www.baizeju.com </div> </body> </html>
출력 결과 :
NodeFilter filter = new StringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
제목과 두 개의 콘텐츠 문자열, 링크 문자열이 모두 출력되는 것을 볼 수 있지만, 댓글과 링크 태그 자체는 출력되지 않습니다.
getText:白泽居-title-www.baizeju.com ================================================= getText: 白泽居-字符串1-www.baizeju.com ================================================= getText:白泽居-链接文本-www.baizeju.com ================================================= getText: 白泽居-字符串2-www.baizeju.com =================================================
이 필터는 링크에 특정 문자열이 포함되어 있는지 확인하는 데 사용되며 특정 웹 사이트를 가리키는 링크를 필터링하는 데 사용할 수 있습니다.
테스트 코드:
출력 결과:
NodeFilter filter = new LinkStringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
4.4 기타 여러 필터
getText:a href="http://www.baizeju.com" =================================================
이전에 소개된 필터는 모두 단일 조건에 대해서만 필터링할 수 있는 단순 필터입니다. HTMLParser는 복잡한 조건을 구현하기 위해 간단한 유형의 필터 조합을 지원합니다. 원리는 일반적인 프로그래밍 언어의 논리 연산과 동일합니다.
3.1 AndFilter
AndFilter는 두 가지 유형의 필터를 결합할 수 있습니다. 동시에 조건을 충족하는 노드만 필터링됩니다.
테스트 코드:
출력 결과:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new AndFilter(filterID, filterChild);
3.2 OrFilter
getText:div id="logoindex" =================================================
출력 결과:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new OrFilter(filterID, filterChild);
3.3 NotFilter
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
출력 결과:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
이전 3.2에서 출력된 몇몇 태그를 제외하고 나머지 태그는 여기에 있습니다.
getText:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" ================================================= getText: ================================================= getText:head ================================================= getText:meta http-equiv="Content-Type" content="text/html; charset=gb2312" ================================================= getText:title ================================================= getText:白泽居-www.baizeju.com ================================================= getText:/title ================================================= getText:/head ================================================= getText: ================================================= getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText: ================================================= getText:body ================================================= getText: ================================================= getText: ================================================= getText: ================================================= getText:这是注释 ================================================= getText: 白泽居-www.baizeju.com ================================================= getText:a href="http://www.baizeju.com" ================================================= getText:白泽居-www.baizeju.com ================================================= getText:/a ================================================= getText: ================================================= getText:/div ================================================= getText: 白泽居-www.baizeju.com ================================================= getText:/div ================================================= getText: ================================================= getText:/body ================================================= getText: ================================================= getText:/html ================================================= getText: =================================================
이전 AndFilter를 NotFilter로 교체
테스트 코드:
출력 결과:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new XorFilter(filterID, filterChild);
4.1 NodeClassFilter
getText:div id="top_main" =================================================
TabNameFilter는 필터를 이해하기 가장 쉬운 것으로, 태그 이름을 기반으로 필터링합니다.
테스트에 사용된 HTML 파일은 다음과 같습니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-www.baizeju.com</title>< /head> <html xmlns="http://www.w3.org/1999/xhtml"> <body > <div id="top_main"> <div id="logoindex"> <!--这是注释--> 白泽居-www.baizeju.com <a href="http://www.baizeju.com">白泽居-www.baizeju.com</a> </div> 白泽居-www.baizeju.com </div> </body> </html>
以上就是HTMLParser使用详解(3)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!