QT学习:c++解析html相关

原来我做爬虫的时候,对页面进行解析的时候总是用很简单粗暴的方法,直接找规律。后来在网上看到了gumbo,尝试了一下,发现确实很好用,所以向大家推荐一下。

以下转自:http://blog.csdn.net/whyistao/article/details/37919581

1.c++好像没有太多的html解析库可以用,最后试着在qt里面集成了htmlcxx,一开始在pro里面写了 includepath += 路径,发现仍然没有用
后来发现只要在 HEADERS 和 SOURCES 里面 把htmlcxx的c文件和.h文件 +=进去就行了,像这样:
SOURCES += main.cpp        html/utils.cc         html/Uri.cc         html/ParserSax.cc         html/ParserDom.cc         html/Node.cc         html/Extensions.cc
HEADERS  += mainwindow.h         html/utils.h         html/Uri.h         html/tree.h         html/ParserSax.h         html/ParserDom.h         html/Node.h         html/Extensions.h         html/debug.h         html/ci_string.h         html/wincstring.h         html/tld.h

参考了:   htmlcxx for qt(mingw)      http://blog.chinaunix.net/uid-21525518-id-1824657.html

2.使用gumbo解析
导入c和h文件方法同上,记一下gumbo常用类型
GumboOutput
用GumboOutput来解析html源码,然后output->root即为根节点。
GumboOutput* output = gumbo_parse(htmlString.c_str());
GumboNode* node = output->root
GumboNode    节点
GumboNode node;
获得节点里面的东西
node->v->text                           //  节点的文本
node->v.element.children    // 获得节点的子节点列表
node->type     //节点的类型
GumboVector    节点容器
比如可以   GumboVector  * children  =    node->v.element.children;   来获得节点的子节点列表
(GumboNode*) ( children->data[i] )     //获得这个节点列表的第i个节点
GumboAttribute  节点属性
GumboAttribute* href;
if (node->v.element.tag == GUMBO_TAG_A &&   (href = gumbo_get_attribute(&node->v.element.attributes, "href")))
{    std::cout << href->value << std::endl;  }

节点的类型
  ELEMENT_NODE,普通元素节点,如<html>,<p>,<div>,<span>,<img>
  ATTRIBUTE_NODE,元素属性
  TEXT_NODE,文本节点
  CDATA_SECTION_NODE,即<![CDATA[ ]]>
  ENTITY_REFERENCE_NODE,实体引用,如&
  ENTITY_NODE,实体,如<!ENTITY copyright “Copyright 2010, impng. All rights reserved”]>
  PROCESSING_INSTRUCTION_NODE,PI,处理指令,如<?xml  version=”1.0″?>
  COMMENT_NODE,注释<!–   –>
  DOCUMENT_NODE,根节点,即document.nodeType
  DOCUMENT_TYPE_NODE,DTD,文档类型<!DOCTYPE   >
  DOCUMENT_FRAGMENT_NODE,文档片段
  NOTATION_NODE,DTD中定义的记号  

在代码里的节点类型可以有如下几种           (使用方法       node->type ==  GUMBO_NODE_ELEMENT )
typedef enum {
  /** Document node.  v will be a GumboDocument. */
  GUMBO_NODE_DOCUMENT,
  /** Element node.  v will be a GumboElement. */
  GUMBO_NODE_ELEMENT,
  /** Text node.  v will be a GumboText. */
  GUMBO_NODE_TEXT,
  /** CDATA node. v will be a GumboText. */
  GUMBO_NODE_CDATA,
  /** Comment node.  v. will be a GumboText, excluding comment delimiters. */
  GUMBO_NODE_COMMENT,
  /** Text node, where all contents is whitespace.  v will be a GumboText. */
  GUMBO_NODE_WHITESPACE
} GumboNodeType;

标签类型:                           (使用方法    node->v.element.tag != GUMBO_TAG_SCRIPT   )
typedef enum {
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#the-root-element
  GUMBO_TAG_HTML,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#document-metadata
  GUMBO_TAG_HEAD,
  GUMBO_TAG_TITLE,
  GUMBO_TAG_BASE,
  GUMBO_TAG_LINK,
  GUMBO_TAG_META,
  GUMBO_TAG_STYLE,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#scripting-1
  GUMBO_TAG_SCRIPT,
  GUMBO_TAG_NOSCRIPT,
  GUMBO_TAG_TEMPLATE,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/sections.html#sections
  GUMBO_TAG_BODY,
  GUMBO_TAG_ARTICLE,
  GUMBO_TAG_SECTION,
  GUMBO_TAG_NAV,
  GUMBO_TAG_ASIDE,
  GUMBO_TAG_H1,
  GUMBO_TAG_H2,
  GUMBO_TAG_H3,
  GUMBO_TAG_H4,
  GUMBO_TAG_H5,
  GUMBO_TAG_H6,
  GUMBO_TAG_HGROUP,
  GUMBO_TAG_HEADER,
  GUMBO_TAG_FOOTER,
  GUMBO_TAG_ADDRESS,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#grouping-content
  GUMBO_TAG_P,
  GUMBO_TAG_HR,
  GUMBO_TAG_PRE,
  GUMBO_TAG_BLOCKQUOTE,
  GUMBO_TAG_OL,
  GUMBO_TAG_UL,
  GUMBO_TAG_LI,
  GUMBO_TAG_DL,
  GUMBO_TAG_DT,
  GUMBO_TAG_DD,
  GUMBO_TAG_FIGURE,
  GUMBO_TAG_FIGCAPTION,
  GUMBO_TAG_MAIN,
  GUMBO_TAG_DIV,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#text-level-semantics
  GUMBO_TAG_A,
  GUMBO_TAG_EM,
  GUMBO_TAG_STRONG,
  GUMBO_TAG_SMALL,
  GUMBO_TAG_S,
  GUMBO_TAG_CITE,
  GUMBO_TAG_Q,
  GUMBO_TAG_DFN,
  GUMBO_TAG_ABBR,
  GUMBO_TAG_DATA,
  GUMBO_TAG_TIME,
  GUMBO_TAG_CODE,
  GUMBO_TAG_VAR,
  GUMBO_TAG_SAMP,
  GUMBO_TAG_KBD,
  GUMBO_TAG_SUB,
  GUMBO_TAG_SUP,
  GUMBO_TAG_I,
  GUMBO_TAG_B,
  GUMBO_TAG_U,
  GUMBO_TAG_MARK,
  GUMBO_TAG_RUBY,
  GUMBO_TAG_RT,
  GUMBO_TAG_RP,
  GUMBO_TAG_BDI,
  GUMBO_TAG_BDO,
  GUMBO_TAG_SPAN,
  GUMBO_TAG_BR,
  GUMBO_TAG_WBR,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/edits.html#edits
  GUMBO_TAG_INS,
  GUMBO_TAG_DEL,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#embedded-content-1
  GUMBO_TAG_IMAGE,
  GUMBO_TAG_IMG,
  GUMBO_TAG_IFRAME,
  GUMBO_TAG_EMBED,
  GUMBO_TAG_OBJECT,
  GUMBO_TAG_PARAM,
  GUMBO_TAG_VIDEO,
  GUMBO_TAG_AUDIO,
  GUMBO_TAG_SOURCE,
  GUMBO_TAG_TRACK,
  GUMBO_TAG_CANVAS,
  GUMBO_TAG_MAP,
  GUMBO_TAG_AREA,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-map-element.html#mathml
  GUMBO_TAG_MATH,
  GUMBO_TAG_MI,
  GUMBO_TAG_MO,
  GUMBO_TAG_MN,
  GUMBO_TAG_MS,
  GUMBO_TAG_MTEXT,
  GUMBO_TAG_MGLYPH,
  GUMBO_TAG_MALIGNMARK,
  GUMBO_TAG_ANNOTATION_XML,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-map-element.html#svg-0
  GUMBO_TAG_SVG,
  GUMBO_TAG_FOREIGNOBJECT,
  GUMBO_TAG_DESC,
  // SVG title tags will have GUMBO_TAG_TITLE as with HTML.
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/tabular-data.html#tabular-data
  GUMBO_TAG_TABLE,
  GUMBO_TAG_CAPTION,
  GUMBO_TAG_COLGROUP,
  GUMBO_TAG_COL,
  GUMBO_TAG_TBODY,
  GUMBO_TAG_THEAD,
  GUMBO_TAG_TFOOT,
  GUMBO_TAG_TR,
  GUMBO_TAG_TD,
  GUMBO_TAG_TH,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#forms
  GUMBO_TAG_FORM,
  GUMBO_TAG_FIELDSET,
  GUMBO_TAG_LEGEND,
  GUMBO_TAG_LABEL,
  GUMBO_TAG_INPUT,
  GUMBO_TAG_BUTTON,
  GUMBO_TAG_SELECT,
  GUMBO_TAG_DATALIST,
  GUMBO_TAG_OPTGROUP,
  GUMBO_TAG_OPTION,
  GUMBO_TAG_TEXTAREA,
  GUMBO_TAG_KEYGEN,
  GUMBO_TAG_OUTPUT,
  GUMBO_TAG_PROGRESS,
  GUMBO_TAG_METER,
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#interactive-elements
  GUMBO_TAG_DETAILS,
  GUMBO_TAG_SUMMARY,
  GUMBO_TAG_MENU,
  GUMBO_TAG_MENUITEM,
  // Non-conforming elements that nonetheless appear in the HTML5 spec.
  // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#non-conforming-features
  GUMBO_TAG_APPLET,
  GUMBO_TAG_ACRONYM,
  GUMBO_TAG_BGSOUND,
  GUMBO_TAG_DIR,
  GUMBO_TAG_FRAME,
  GUMBO_TAG_FRAMESET,
  GUMBO_TAG_NOFRAMES,
  GUMBO_TAG_ISINDEX,
  GUMBO_TAG_LISTING,
  GUMBO_TAG_XMP,
  GUMBO_TAG_NEXTID,
  GUMBO_TAG_NOEMBED,
  GUMBO_TAG_PLAINTEXT,
  GUMBO_TAG_RB,
  GUMBO_TAG_STRIKE,
  GUMBO_TAG_BASEFONT,
  GUMBO_TAG_BIG,
  GUMBO_TAG_BLINK,
  GUMBO_TAG_CENTER,
  GUMBO_TAG_FONT,
  GUMBO_TAG_MARQUEE,
  GUMBO_TAG_MULTICOL,
  GUMBO_TAG_NOBR,
  GUMBO_TAG_SPACER,
  GUMBO_TAG_TT,
  // Used for all tags that don‘t have special handling in HTML.
  GUMBO_TAG_UNKNOWN,
  // A marker value to indicate the end of the enum, for iterating over it.
  // Also used as the terminator for varargs functions that take tags.
  GUMBO_TAG_LAST,
} GumboTag;

3.使用gumbo的时候,报了一个RtlWerpReportException failed with status code :-1073741823 错,
一开始以为是堆栈溢出的问题,后来发现是自己代码逻辑没写对,最好对照着官方demo的用法去写
if (node->v.element.tag == GUMBO_TAG_A &&      (href = gumbo_get_attribute(&node->v.element.attributes, "href")))
{    std::cout << href->value << std::endl;  }

4.编译gumbo的时候报了一个错
 错误:‘for‘ loop initial declarations are only allowed in C99 mode
所以在项目pro配置里要加上这两句
QMAKE_CFLAGS_DEBUG +=  --std=c99
QMAKE_CFLAGS_RELEASE +=  --std=c99

转载请注明:http://www.cnblogs.com/fnlingnzb-learner/p/5835428.html

时间: 2024-08-23 07:29:05

QT学习:c++解析html相关的相关文章

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

QT学习第1天

QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) (3)2005年QT4.0 (4)2008年被Nokia收购 (5)2009年源代码开源 (6)2012年Nokia将全部QT业务和知识产权卖给Digia公司 (7)2013年QT5.0 QT5.1 QT5.2 (8)2014年Digia公司成立 The Qt Company子公司 2.Qt5.4

Qt学习之如何启动和终止一个线程

先来给出每个文件的相关代码然后再加以分析 Cpp代码   //*************dialog.h**************// #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #define MAXSIZE 5  //最大的线程数 class QDialogButtonBox; class QProgressBar; class QPushButton; class WorkThread; class ThreadDlg : 

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

Android学习xml解析大全之SAX和DOM

  随着android的学习解析xml成为了很多朋友面临的问.想学习如何解析xml就要先了解xml是什么. XML称为可扩展标记语言(Extensible Markup Language),由标准通用标记语言(SGML:Standard Generalized Markup Language)发展而来,允许开发者自定义标签,可以实现标签和内容的有效分离. 与HTML不同,XML不再侧重于数据如何表现,而是更多的关注数据如何存储和传输.因此,XML逐渐演变成为一种跨平台的数据交换格式.通过使用XM

QT学习教程

原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt5入门学习,最近正在参考,转载希望更多人看到,也为自己以后找到本资料提供方便. Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 MainWindow 简介 添加动作 资源文件 对象模型 布局管理器 菜单栏.工具栏和状态栏 对话框简介 对话框

QT学习资料收集

几个专栏 Qt学习之路(3):Hello, world!(续) - 豆子空间 - 51CTO技术博客 http://devbean.blog.51cto.com/448512/194137 Qt 学习之路 2 | DevBean's World https://www.devbean.net/category/qt-study-road-2/ 专栏:Qt实战一二三 - 博客频道 - CSDN.NET http://blog.csdn.net/column/details/qshare.html?

Qt 学习(2)

Qt 学习(2) Qt 的 QXmlStreamReader 在 Qt 应用程序中访问 XML 格式的文件数据,可以使用 [QXmlStreamReader][sreamreader] 对文件进行读取.关于 QXmlStreamReder 的使用,官方文档中有 QXmlStream Bookmarks Example 的示例可供参考. 常用的方法有: TokenType readNext() 读取下一个标记并返回它的类型 bool readNextStartElement() 在当前元素内,读取

Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)

QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的. 线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储