> 웹 프론트엔드 > HTML 튜토리얼 > HTMLParser 사용법에 대한 자세한 설명(3)

HTMLParser 사용법에 대한 자세한 설명(3)

黄舟
풀어 주다: 2016-12-29 15:57:20
원래의
1209명이 탐색했습니다.

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);
}
로그인 후 복사
(3) 논리 연산. 필터(4) 기타 필터: HTMLParser 시작하기(2) - 노드 콘텐츠 우리는 이미 다양한 유형의 노드에 대해 배웠습니다. 이 필터는 유형을 기준으로 필터링할 수 있습니다.

테스트 코드:



출력 결과:

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
=================================================
로그인 후 복사
4.3 LinkStringFilter

이 필터는 링크에 특정 문자열이 포함되어 있는지 확인하는 데 사용되며 특정 웹 사이트를 가리키는 링크를 필터링하는 데 사용할 수 있습니다.
테스트 코드:



출력 결과:

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

이전 AndFilter를 OrFilter로 교체
getText:div id="logoindex"
=================================================
로그인 후 복사
테스트 코드:




출력 결과:

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new OrFilter(filterID, filterChild);
로그인 후 복사


3.3 NotFilter

이전 AndFilter를 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:
=================================================
로그인 후 복사
3.4 XorFilter

이전 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"
=================================================
로그인 후 복사
2.1 TagNameFilter

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)!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿