利用C#語(yǔ)言構(gòu)造一個(gè)Web程序
本文介紹如何用C#語(yǔ)言構(gòu)造一個(gè)Web程序,它能夠把整個(gè)網(wǎng)站的內(nèi)容下載到某個(gè)指定的目錄,程序的運(yùn)行界面。你可以方便地利用本文提供的幾個(gè)核心類(lèi)構(gòu)造出自己的Web程序。
C#特別適合于構(gòu)造Web程序,這是因?yàn)樗呀?jīng)內(nèi)置了HTTP訪問(wèn)和多線程的能力,而這兩種能力對(duì)于Web程序來(lái)說(shuō)都是非常關(guān)鍵的。下面是構(gòu)造一個(gè)Web程序要解決的關(guān)鍵問(wèn)題:
1.HTML分析:需要某種HTML解析器來(lái)分析Web程序遇到的每一個(gè)頁(yè)面;
2.頁(yè)面處理:需要處理每一個(gè)下載得到的頁(yè)面。下載得到的內(nèi)容可能要保存到磁盤(pán),或者進(jìn)一步分析處理;
3.多線程:只有擁有多線程能力,Web程序才能真正做到高效;
4.確定何時(shí)完成:不要小看這個(gè)問(wèn)題,確定任務(wù)是否已經(jīng)完成并不簡(jiǎn)單,尤其是在多線程環(huán)境下。
HTML解析
C#語(yǔ)言本身不包含解析HTML的能力,但支持XML解析;不過(guò),XML有著嚴(yán)格的語(yǔ)法,為XML設(shè)計(jì)的解析器對(duì)HTML來(lái)說(shuō)根本沒(méi)用,因?yàn)镠TML的語(yǔ)法要寬松得多。為此,我們需要自己設(shè)計(jì)一個(gè)HTML解析器。本文提供的解析器是高度獨(dú)立的,你可以方便地將它用于其它用C#處理HTML的場(chǎng)合。
本文提供的HTML解析器由ParseHTML類(lèi)實(shí)現(xiàn),使用非常方便:首先創(chuàng)建該類(lèi)的一個(gè)實(shí)例,然后將它的Source屬性設(shè)置為要解析的HTML文檔:
- ParseHTML parse = new ParseHTML();
- parse.Source = "Hello World";
接下來(lái)就可以利用循環(huán)來(lái)檢查HTML文檔包含的所有文本和標(biāo)記。通常,檢查過(guò)程可以從一個(gè)測(cè)試Eof方法的while循環(huán)開(kāi)始:
- while(!parse.Eof())
- {
- char ch = parse.Parse();
Parse方法將返回HTML文檔包含的字符--它返回的內(nèi)容只包含那些非HTML標(biāo)記的字符,如果遇到了HTML標(biāo)記,Parse方法將返回0值,表示現(xiàn)在遇到了一個(gè)HTML標(biāo)記。遇到一個(gè)標(biāo)記之后,我們可以用GetTag()方法來(lái)處理它。
- if(ch==0)
- {
- HTMLTag tag = parse.GetTag();
- }
一般地,Web程序最重要的任務(wù)之一就是找出各個(gè)HREF屬性,這可以借助C#的索引功能完成。例如,下面的代碼將提取出HREF屬性的值(如果存在的話)。
- Attribute href = tag["HREF"];
- string link = href.Value;
獲得Attribute對(duì)象之后,通過(guò)Attribute.Value可以得到該屬性的值。以上介紹利用C#語(yǔ)言構(gòu)造一個(gè)Web程序
【編輯推薦】