国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
向HtmlAgilityPack道歉:解析HTML還是你好用

去年寫過一篇文章《解析HTML最好的類還是微軟自己的》(http://www.cnblogs.com/rupeng/archive/2010/06/26/1765840.html),回復(fù)中有朋友提到可以使用HtmlAgilityPack來進(jìn)行HTML的解析。當(dāng)時(shí)只是匆匆的測試了一下,發(fā)現(xiàn)HtmlAgilityPack得到的InnerText中有很多的不干凈的script、樣式內(nèi)容,就斷定“不是很滿意,解析DiscuzNT!論壇的帖子頁面的時(shí)候有問題,沒法正確得到Body.InnerText的內(nèi)容,有很多殘留html、js代碼夾雜在其中,解析的不是很好。”

 

傳智播客.net培訓(xùn)學(xué)院內(nèi)部有一個(gè)工具是我開發(fā)的,其中的HTML解析部分就是我使用MSHTML完成的,但是今天發(fā)現(xiàn)這個(gè)軟件一個(gè)Bug,是MSHTML的HTMLDocumentClass在多線程并發(fā)時(shí)候有時(shí)候會(huì)造成死鎖。MSHTML是工作在UI線程中的(如果不把DesignMode設(shè)置為On,則HTML中的javascript會(huì)被執(zhí)行就是證明),并不是一個(gè)干凈的、獨(dú)立的HTML解析組件,因此出現(xiàn)這樣的問題很難調(diào)試。因此決定還是換用MSHTML實(shí)現(xiàn)。


那么如何解決HtmlAgilityPack得到的InnerText中有殘留的script、樣式的問題呢,在google上搜索“HtmlAgilityPack script innerText”找到了stackoverflow上的這篇文章《C#: HtmlAgilityPack extract inner text》http://stackoverflow.com/questions/2785092/c-htmlagilitypack-extract-inner-text

代碼如下:

foreach(var script in doc.DocumentNode.Descendants("script").ToArray())    script.Remove();foreach(var style in doc.DocumentNode.Descendants("style").ToArray())    style.Remove();string innerText = doc.DocumentNode.InnerText;
 

原來這樣簡單呀,就是把所有的script、style標(biāo)簽從dom樹中去掉(為了解決迭代器在工作時(shí)不能從集合中Remove元素的問題,使用ToArray()轉(zhuǎn)換為數(shù)組再遍歷)。

這樣操作發(fā)現(xiàn)還是有殘留的script:

<!--[if IE]><script language="JavaScript"> var objmain = document.getElementById("main"); function updatesize(){ var bodyw = window.document.body.offsetWidth; var w=(bodyw<=790?"790px":"100%"); objmain.style.width=w; } updatesize(); window.onresize = updatesize; </script><![endif]-->

 

仔細(xì)一看原來是帶條件注釋的script,因此用下面的方法去掉所有的注釋節(jié)點(diǎn):

代碼如下:

foreach(var script in doc.DocumentNode.Descendants("script").ToArray())    script.Remove();foreach(var style in doc.DocumentNode.Descendants("style").ToArray())    style.Remove();foreach (var comment in doc.DocumentNode.SelectNodes("//comment()").ToArray())    comment.Remove();//新增的代碼string innerText = doc.DocumentNode.InnerText;

 

解釋:HtmlAgilityPack是使用XPath語法,"http://comment()"在XPath中表示“所有注釋節(jié)點(diǎn)”,關(guān)于XPath的詳細(xì)用法請參考XPath的資料。

其他可能有用的技術(shù)點(diǎn):
1、獲取網(wǎng)頁title:doc.DocumentNode.SelectSingleNode("http://title").InnerText;
解釋:XPath中“//title”表示所有title節(jié)點(diǎn)。SelectSingleNode用于獲取滿足條件的唯一的節(jié)點(diǎn)。


2、獲取所有的超鏈接:doc.DocumentNode.Descendants("a")


3、獲取name為kw的input,也就是相當(dāng)于getElementsByName():
            var kwBox = doc.DocumentNode.SelectSingleNode("http://input[@name='kw']");

解釋:"http://input[@name='kw']"也是XPath的語法,表示:name屬性等于kw的input標(biāo)簽。

 

經(jīng)過這次使用HtmlAgilityPack得出結(jié)論:還是HtmlAgilityPack強(qiáng)大?。?!再見MSHTML!

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
.NET Core HtmlAgilityPack HTML解析利器
手把手教你爬取優(yōu)酷電影信息-2
HTML解析組件HtmlAgilityPack使用
深究AngularJS——過濾器(filter)
Js實(shí)現(xiàn)Map對(duì)象
提高HTML頁面性能的技巧
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服