關於HTML文件解析中DOM樹的構建猜測
這兩年人工智慧行業發展的比較火熱,對於那些人工智慧領域的大牛們,小編也是四十五度默默仰望。在好奇心的驅使下,小編也漸漸對人工智慧產生了濃厚的興趣,可憐前途是光明的道路是曲折的,小編的學習之旅可想而知,怎一個苦字了得,根本就是修行啊。在人工智慧方面很多書籍都建議使用python語言,這可苦了作為小白的小編了,經歷了好久終於學了點Python的基礎。
在學習Python教程中涉及到了關於網路爬蟲的內容,這讓小編對網頁結構的解析產生了好奇,HTML語言自身的結構很有其特點,在一個區域內會有成對的識別符號出現,用以表示這段內容的起始和終止,並且其語法格式也限定了其不會出現交叉巢狀的情形。這種獨特的網頁結構特點,讓我萌生了編寫自己的網頁解析程式的想法。終於進入正題了,原諒小編是個慢性子。。。
說幹就幹。首先問題來了,一個網頁結構的檔案,雖然層次比較清晰,但是如何讓自己的程式能夠識別出它的這種層次結構呢?這讓小編困擾了好久。。。終於在word文件結構圖的啟示下,小編想起了好久沒有碰過的資料結構中的樹結構。查閱了資料發現HTML 文件有個重要的內容就是構建DOM樹,網上瀏覽了一圈除了知道個DOM樹名詞外,其它的一堆內容小編實在是沒有看明白。於是開始了小編的迷茫之旅。。。
自己動手,豐衣足食。經過了幾天的思考,小編有了重大的突破。依據小編這些年的經驗,一個程式最核心的是思想,其次就是它的開始——確定採用什麼資料結構。經過幾番猜想,小編選定了樹與棧的結合。這種文件層次結構分級比較明顯,很適合採用樹形結構,配合進出棧的操作很容易得到層級關係。
希望就在前方,可是前方似乎總有未知在等你。方向確定了,小編有點竊喜,允許小編嘚瑟一下~小編智商還是槓槓的~哈哈哈~~~進入正題。門是開的,好像有個魔鬼。一旦你作了決定,恭喜你,麻煩就會纏身。HTML結構雖然很清晰,但是,每個層的元素組成個數卻是未知的,這從某種程度上加大了控制的難度。小編又進入苦惱中。。。誰來安慰一下剛剛中了五百萬的卻發現自己原來在做夢的小心臟。請求高手解答。。。對不起你所撥打的電話是空號!!!還是靠自己吧。。。小編從腦海中回想自己所學的幾種結構,心中暗自慶幸還好沒有全部還給老師。。。嘿嘿。。。從線性表中的棧、佇列、連結串列到二叉樹,再到圖中的鄰接多重表。盤算了一圈,感覺鄰接多重表比較靠譜,經過幾番痛苦的假設,終於還是放棄了。
既然是樹結構還是老老實實的用樹吧,經過幾番的分析,小編終於找到了一種解決方案,採用child-root-cousin二叉樹形結構,可以比較好的解決下層節點數量不定的問題。事情到了這裡終於可以有一個比較好的解決方案了。小編可以好好休息一下了。
時間:2017.3.30-- 00:41
繼續我們的DOM樹的構建之旅。方案有了,下面就該親自動手了堆程式碼了。不用多說對於小編這個小白就會點C語言,雖然學了Python但是還不能得心應手,不要笑小編好low,小編會害羞的~~~。
對於小編這種小白,C程式也就馬馬虎虎了,就不丟人現眼了。經過幾番測試終於寫好了一個棧的基本程式結構,然後就開始child-root-cousin樹的構建,程式碼就不貼了,相信有點資料結構基礎的,都比小編強。以下是小編的棧結構體和child-root-cousin二叉樹結構體:
控制棧結構體:
typedef struct Element{
Node node;
struct Element next;
}Element;
struct Stack{
Element top, base;
int length;
};
Child-root-cousin二叉樹節點結構體:
typedef struct Node{
int data;
struct Node parent;
struct Node cousin;
struct Node * child;
int child_num;
}Node;
因為HTML結構比較分明,而且HTML檔案的解析涉及到很多的物件不是問題研究的重點,所以小編測試的時候就偷了個懶,採用一個整形陣列,類似這種結構{1,2,3,-3,4,-4,-2,5,-5,-1}表示HTML檔案,個人感覺還是挺能說明問題的。
以上對於HTML文件中DOM樹的構建是小編的個人猜測,至於HTML真是的結構小編就不太清楚了,如有知道詳情的親們,麻煩分享一下,讓我等小白好好拜讀。
時間:2017.3.30 --01:03
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2798570/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中Dom解析xml文件JavaXML
- WebKit Inside: DOM樹的構建WebKitIDE
- html DOM樹物件HTML物件
- 關於Simple_html_dom的小應用HTML
- 關於scala中的主建構函式函式
- 關於自動化構建的思維導圖解析圖解
- PLSQL中的DOM 解析SQL
- 從 Chrome 原始碼看瀏覽器如何構建 DOM 樹Chrome原始碼瀏覽器
- 關於 DOM 的理解
- HTML文件結構HTML
- 瀏覽器工作原理(22) - JavaScript是如何影響DOM樹構建的?瀏覽器JavaScript
- 關於elementUI樹狀結構的bugUI
- 更快地構建 DOM: 使用預解析, async, defer 以及 preload
- 關於dom(javascript)JavaScript
- vue基於Element構建自定義樹Vue
- 【譯】資料結構中關於樹的一切(java版)資料結構Java
- 將HTML字元轉換為DOM節點並動態新增到文件中HTML字元
- 關於C++中建構函式的常見疑問C++函式
- 關於struts中html:errors/的問題HTMLError
- 關於JS中事件代理的解析JS事件
- 關於C#中建構函式的繼承的問題C#函式繼承
- html概述及html文件基本結構HTML
- 基於 DOM 的 XML 檔案解析類XML
- Java關於資料結構的實現:樹Java資料結構
- 關於一個樹狀結構的通用類
- (樹)根據中序後序構建二叉樹二叉樹
- Element 文件中的 Markdown 解析
- 使用JAXP對xml文件進行DOM解析基礎XML
- 關於建構函式的一點理解函式
- DOM(文件物件模型):理解網頁結構與內容操作的關鍵技術物件模型網頁
- 記憶體中html原始碼用IHTMLDocument2進行DOM方式解析記憶體HTML原始碼
- 關於構建REST風格的SOE的策略REST
- 關於建構函式與解構函式的分享函式
- 關於HTMLHTML
- JavaScript HTML DOMJavaScriptHTML
- html標記與文件結構HTML
- css+html關於文字的總結(整理中)CSSHTML
- DOM 解析