首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 2.0 實作網路蜘蛛 WebSpider(五):狀態機解析 HTML 標籤、GetA 狀態轉移擷取 href、事件通知發現新 URL

     編輯:關於C語言

狀態機設計:5 狀態擷取 <a> 標籤

  • 狀態 0:讀入 '<' → 狀態 1
  • 狀態 1:讀入 'a'/'A' → 狀態 2,其他 → 狀態 0
  • 狀態 2:讀入空白/Tab → 狀態 3,其他 → 狀態 0
  • 狀態 3:讀入 '>' → 成功擷取一個 <a>,歸零;其他保持
  • 狀態 4:終止態(雙圏表示)

圖 1:狀態機圖

GetA 完整實作


private void getA()
{
    char[] buffer = new char[1024];
    int state = 0;
    String a = "";
    while (!sr.EndOfStream)
    {
        int n = sr.Read(buffer, 0, buffer.Length);
        for (int i = 0; i < n; i++)
        {
            switch (state)
            {
                case 0:
                    if (buffer[i] == '<') { a += buffer[i]; state = 1; }
                    break;
                case 1:
                    if (buffer[i] == 'a' || buffer[i] == 'A') { a += buffer[i]; state = 2; }
                    else { a = ""; state = 0; }
                    break;
                case 2:
                    if (buffer[i] == ' ' || buffer[i] == '\t') { a += buffer[i]; state = 3; }
                    else { a = ""; state = 0; }
                    break;
                case 3:
                    if (buffer[i] == '>')
                    {
                        a += buffer[i];
                        try
                        {
                            string url = getUrl(getHref(a));
                            if (url != null && findUrl != null)
                                findUrl(url); // 觸發發現 URL 事件
                        }
                        catch { }
                        state = 0;
                    }
                    else a += buffer[i];
                    break;
            }
        }
    }
}

擷取完整 <a> 標籤後,鏈式呼叫 getHref → getUrl → getFullUrl,最後觸發 findUrl 事件通知發現新 URL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved