from http://blog.csdn.net/q408384053/article/details/8070627
因為最近在弄一個獲取課表的程序,課表的內容來自教務系統網站,所以需要解析html。然后我就在網上搜索”c++解析html“,然后就找到了htmlcxx這個開源庫,下載下來,發現不會使用它,然后又在網站上搜索相關資料。最后找到一個博客(http://www.cnblogs.com/zhanglanyun/),然后用email聯系了他,解決了問題,很感謝他!
接着說如何使用(作為參考,可能在別人的電腦上和我這有些區別):
1.下載htmlcxx庫,我下的是tar.gz格式的,然后用解壓軟件將它解壓出來。
2.找到一個vs的工程文件htmlcxx.vcproj(舊版本的vs工程),打開打,直接編譯可能會提示有一個錯誤(因為在我電腦里出現了),錯誤指向了一個常字符指針(const char *),如下圖,然后只需要把后面的引號刪掉,重新打一次,再編譯,就可以成功編譯了。
3.編譯完成之后,工程生成了一個lib靜態庫文件。
4.但是這個庫下載下來是不支持中文的,也就是說比如html中標簽里含有中文,就會出錯(這是我在獲取源代碼時,因為獲取不完全,導致程序出錯,才發現的)。如果出現了這個問題,可以查看以下兩個博客,里面有解決方法。
http://my.oschina.net/leeeryan/blog/9914
http://blog.csdn.net/schoolers/article/details/6891061
5.然后在你的工程里面設置vc的包含目錄和庫目錄,把htmlcxx文件夾包含,然后庫目錄包含剛才生成的lib的文件夾。另外,也可以將剛生成的lib拷貝到你的工程目錄下,用#pragma (lib, "xxxx.lib")加載靜態鏈接庫。
6.接着,在 工程屬性->c/c++->代碼生成 里面將運行庫設置為/MTd。
這就可以使用了。
如何使用呢?
以控制台為例
1.#include <htmlcxx/html/ParserDom.h>
2. #include <htmlcxx/html/utils.h>
3.使用命名空間,using namespace htmlcxx
4.
- HTML::ParserDom parser ; //可以用來將html代碼轉換成dom樹
- tree<HTML::Node> dom ; //用來儲存html各個節點
- tree<HTML::Node>::iterator iterator ; //樹的迭代器
- iterator = dom.begin () ; //得到dom的第一個節點
- iterator->tagName () ; //獲得節點的標簽名
- iterator->parserAttributes () ; //附上節點屬性
- iterator->Attribute ("href").second ; //此行執行需要上行,這相當於獲取標簽的href屬性,之所以有second,因為Attribute ("attributeName")返回了一個pair
HTML::ParserDom parser ; //可以用來將html代碼轉換成dom樹 tree<HTML::Node> dom ; //用來儲存html各個節點 tree<HTML::Node>::iterator iterator ; //樹的迭代器 iterator = dom.begin () ; //得到dom的第一個節點 iterator->tagName () ; //獲得節點的標簽名 iterator->parserAttributes () ; //附上節點屬性 iterator->Attribute ("href").second ; //此行執行需要上行,這相當於獲取標簽的href屬性,之所以有second,因為Attribute ("attributeName")返回了一個pair
在博客記錄一下,方便以后使用。若有說的不對的地方,歡迎指出。