위한 것이라는 말을 잊어 버렸습니다.
이 경우 Jsoup 라이브러리로 만드는 것이 하나의 옵션입니다.
1. Java 버전
첫째, html 태그에서 단어 목록을 준비합니다.
final List<String> wordList = new ArrayList<String>();
그런 다음 Jsoup의 NodeVisitor 클래스를 사용하여 html 콘텐츠를 탐색합니다.
doc.body().traverse(
new NodeVisitor(){
@Override
public void head(Node arg0, int arg1) {
if(arg1 == 1)
{
String value = arg0.outerHtml();
if(!wordList.contains(value))
wordList.add(arg0.outerHtml());
}
}
@Override
public void tail(Node arg0, int arg1) {
}
}
);
마지막으로 코드는 다음과 같습니다.
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;
import org.jsoup.select.NodeVisitor;
public class HtmlTest {
public static String parseHtml(String str) {
org.jsoup.nodes.Document doc = Jsoup.parse(str);
final List<String> wordList = new ArrayList<String>();
doc.body().traverse(
new NodeVisitor(){
@Override
public void head(Node arg0, int arg1) {
if(arg1 == 1)
{
//String value = Jsoup.parse(arg0.outerHtml()).text();
String value = arg0.outerHtml();
if(!wordList.contains(value))
wordList.add(arg0.outerHtml());
}
}
@Override
public void tail(Node arg0, int arg1) {
}
}
);
for(String word: wordList)
{
System.out.println(word);
}
return "";
}
public static void main(String[] args)
{
System.out.println(parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you."));
}
}
출력 모습이어야
We are
<b><i>very</i></b>
<b>a</b>
mused! Thank you.
2. C# 버전
음, C# 버전의 소스 코드는 litte 비트 다르지만 동일한 프로세스 (약간의 변경이 필요함).
이것은 내 NodeVisitor 버전의 코드입니다.
먼저 HTML 내용을 구문 분석하십시오.
Document doc = NSoupClient.Parse(str);
둘째, 'body'태그에서 원본 문장을 선택하십시오.
doc.Select("body").Traverse(new TestNodeVisitor(wordList));
전체 코드는 다음과 같습니다.
using NSoup;
using NSoup.Nodes;
using NSoup.Select;
using System;
using System.Collections.Generic;
using System.IO;
namespace NSoupTest
{
class Program
{
private class TestNodeVisitor : NodeVisitor
{
List<String> wordList;
public TestNodeVisitor(List<String> wordList)
{
this.wordList = wordList;
}
public void Head(Node node, int depth)
{
if(depth == 1)
{
String value = node.OuterHtml();
if(!wordList.Contains(value))
wordList.Add(value);
}
}
public void Tail(Node node, int depth)
{
}
}
public static String parseHtml(String str) {
Document doc = NSoupClient.Parse(str);
List<String> wordList
= new List<String>();
doc.Select("body").Traverse(new TestNodeVisitor(wordList));
foreach (String word in wordList)
{
Console.WriteLine(word);
}
return "";
}
static void Main(string[] args)
{
try
{
parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you.");
}
catch (FileNotFoundException fe) {
Console.WriteLine(fe.Message);
}
}
}
}
출력은
We are
<b><i>very</i></b>
<b>a</b>
mused! Thank you.
당신은 내가 site에서 현재 (사실이 아닌 공식 버전 0.8.0)에서 사용 NSoup 라이브러리를 찾을 수 있어야한다.
공식 NSoup 사이트는 here이지만 방문자 인터페이스는 없습니다.
그런 다음 독자적인 방법으로 코드를 완성 할 수 있습니다.
귀하의 목표에 맞는 옵션 일뿐입니다.
Regard,
은 파서를 정의하는 매우 편리한 상황처럼 보입니다. 이를 위해 규칙이 명확해야합니다. '' "''을 기반으로 분할하면 태그는 모두 하나의 사슬에 담겨있는 것처럼 보입니다. 그렇다면'<'는 부분 문자열을 최종 목록으로 끌어 내기 위해 일치하는'> '을 찾아야합니다. 그런 다음'!'와'\ nT '는 특별한 처리가 필요합니다. – nullpointer