HTMLParser使用方式彙總(適用C# JAVA):html
1. Lexer模式:node
2. NodeFilter模式web
3. NodeVisitor模式ide
-----------------------------------------涯上月灬指香專用分割線---------------------------------------------spa
1. HTMLParser解析的數據來源: htm
WebClient webclient = new WebClient();
String htmlContent = webclient.DownloadString("https://www.baidu.com/");blog
2. (Lexer模式)繼承
使用依據: 該模式對總體數據負責,會返回一個線性的Node節點序列:rem
使用方式:string
Lexer lexer = new Lexer(htmlContent);
Parser parser = new Parser();
parser.Lexer = lexer;
NodeList nodelist = parser.Parse(null); //開始解析,返回一個全部節點的線性序列
int size = nodelist.Size();
Console.WriteLine("掃描節點數:" + nodelist.Size());
for (int i = 0; i < size; i++)
{
INode node = nodelist.ElementAt(i);
Console.WriteLine(node.ToString());
}
Console.WriteLine("掃描結束");
3. (NodeFilter模式)
使用依據: 根據NodeFilter的要求過濾出符合要求的Node,只對結果負責
使用方式:
Parser parser = new Parser();
parser.InputHTML = htmlContent;
NodeList nodelist = parser.Parse(new NodeClassFilter(typeof(Winista.Text.HtmlParser.Tags.ImageTag))); //指定過濾出的標籤爲<Img>
for (int i = 0; i < nodelist.Size(); i++)
{
ImageTag node = (ImageTag)nodelist.ElementAt(i);
Console.WriteLine("href = {0}", node.ImageURL);
}
//若是沒有你須要的過濾節點類型,可自定義節點過濾器
NodeList nodelist = parser.Parse(new CustomNodeFilter());
for (int i = 0; i < nodelist.Size(); i++)
{
INode node = nodelist.ElementAt(i);
Console.WriteLine(node.GetText());
}
class CustomNodeFilter : NodeFilter
{
public bool Accept(INode node) //自定義過濾器的條件
{
if(node is MetaTag)
{
MetaTag tag = (MetaTag)node;
if(tag.GetAttribute("title") != null)
{
return true;
}
}
return false;
}
}
Ps:
(繼承樹)
(Tags 類型圖)
4. (NodeVisitor模式)
使用條件: 須要瞭解Parser解析過程,該模式對過程負責
使用方式:
Parser parser = new Parser();
parser.InputHTML = htmlContent;
parser.VisitAllNodesWith(new CustomNodeVIsitor());
class CustomNodeVIsitor: NodeVisitor
{
public override void BeginParsing() //當開始解析Html時回調
{
Console.WriteLine("開始解析Html頁面");
}
public override void VisitTag(ITag tag) //當訪問到一對標籤的開始標籤時回調 ,像<html>...</html> 中的<html>
{
Console.WriteLine("開始解析TAG" + tag.TagName);
}
public override void VisitEndTag(ITag tag) //當訪問到一對標籤的結束標籤時回調, 像<html>...</html>中的</html>
{
Console.WriteLine("結束解析TAG" + tag.TagName);
}
public override void VisitStringNode(IText string_Renamed) //當訪問到文本標籤時回調, 像<div>我是內容</div>中的「我是內容」就是一個文本標籤
{
Console.WriteLine("掃描到文本標籤了");
}
public override void VisitRemarkNode(IRemark remark) //當訪問到註釋標籤時,回調
{
Console.WriteLine("掃描到註釋標籤了");
}
}