前面说了那么多,终于说到如何解析html表单信息了。

什么是表单信息呢,这里我们先要有一些概念:

如上图,这是一个QQ注册页面,注册页面当中需要我们填的空其实就是一个表单信息。

具体到html代码当中,如下

<form action="action_page.php">
First name:<br>
<input type="text" name="firstname" value="Mickey">
<br>
Last name:<br>
<input type="text" name="lastname" value="Mouse">
<br><br>
<input type="submit" value="Submit">
</form> 

(html摘自w3cschool)

(上图摘自w3cschool)

一般而言,表单信息的标签都为input标签,或是select标签。当我们要上传表单的时候,主要post给服务器的是表单标签当中的name和value属性,如果我们要解析表单的话,只要将这两个属性解析出来就好。在浏览器当中我们上传表单的过程大概是这样子的

其实就是吧我们刚才填入表单的数据post到服务器。

以下给出代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include "gumbo.h"#define parse_h//检查select标签下被选中的option标签
void find_selected(GumboNode *node,char * str_value)
{GumboVector *children;GumboAttribute *value;GumboNode *child;int i;children=&node->v.element.children;if(str_value!=NULL){for(i=0;i<children->length;i++){child=((GumboNode*)children->data[i]);if(child->v.element.tag==GUMBO_TAG_OPTION)//检查其是否为option标签
        {if(gumbo_get_attribute(&child->v.element.attributes,"selected"))//检查option是否被选中
            {if((value=gumbo_get_attribute(&child->v.element.attributes,"value"))!=NULL)//保存option标签的value值
                {strcpy(str_value,(char *)value->value);return;}else{strcpy(str_value," ");return;}}}}strcpy(str_value," ");}return;}//解析表单信息,将结果添加到链表当中
void findDataFormItem(GumboNode *node)
{GumboVector *children;int i;GumboAttribute *name;GumboAttribute *value;GumboAttribute *type;GumboAttribute *checked;char str_value[100];if(header==NULL){printf("header is null/n");return;}if(node->type!=GUMBO_NODE_ELEMENT) return;//如果节点不为元素节点就返回,至于什么是元素节点,请查找dom树的有关资料
children=&node->v.element.children;//获取子节点if((node->v.element.tag==GUMBO_TAG_INPUT)&&(name=gumbo_get_attribute(&node->v.element.attributes,"name"))&&(value=gumbo_get_attribute(&node->v.element.attributes,"value")))//如果标签为input标签,并且有name和value属性
    {if((type=gumbo_get_attribute(&node->v.element.attributes,"type")))//检查input标签类型
        {//当input标签的类型为checkbox类型的时候,是有当checkbox被选中的时候,才将name和value添加到链表当中,其余,直接添加if(strcmp((char*)type->value,"checkbox")){printf("name=%s\n",(char *)name->value);printf("value=%s\n",(char *)value->value);}else{if((checked=gumbo_get_attribute(&node->v.element.attributes,"checked"))){printf("name=%s\n",(char *)name->value);printf("value=%s\n",(char *)value->value);}}}}if((node->v.element.tag==GUMBO_TAG_SELECT)&&(name=gumbo_get_attribute(&node->v.element.attributes,"name")))//如果标签为select标签,并且有name属性
    {find_selected(node,str_value);//检查select标签下的option标签,如果某个option标签的有selected属性(表示选项被选中),就将其value保存到链表当中
        printf("name=%s\n",(char *)name->value);printf("value=%s\n",str_value);}//递归扫描if(!(node->v.element.tag==GUMBO_TAG_SELECT)){for(i=0;i<children->length;++i){findDataFormItem((GumboNode*)(children->data[i]),header);}}
}//解析html表单数据,并且将表单标签的name和value数据保存到一个链表当中
void ParseFormItems(char *htmlFile)
{GumboOutput *DOMtree;DOMtree=gumbo_parse(htmlFile);//解析html数据成为一刻,dom树,要多了解的话应该查找一些有关html5 dom树的知识
findDataFormItem(DOMtree->root);//解析表单信息
gumbo_destroy_output(&kGumboDefaultOptions,DOMtree);//释放资源
}

大家一开始可能并不是十分了解gumbo解析html页面的逻辑,其实gumbo解析html页面也是根据dom树和html5的逻辑来的。

推荐一个html5标准的参考资料https://html.spec.whatwg.org/multipage/


转载于:https://www.cnblogs.com/thegodofthunder/p/7237802.html

Linux c使用gumbo库解析页面表单信息(三)相关推荐

  1. Linux c使用gumbo库解析页面表单信息(二)

    一.如何在程序当中使用gumbo? 要想在代码中使用gumbo,仅仅包含gumbo头文件是不够的,必须在编译程序的时候加上-lgumbo选项,编译程序才会链接到gumbo库上面. 这是我编译gumbo ...

  2. linux 动态解析,Linux 动态函式库解析[转]Linux -电脑资料

    在本文的这个部分,针对 Linux 系统是如何来辨别这些不同的可执行档,以及整体的执行流程来作一个说明, ByWing 程序启动的流程 在 linux 的环境中最常见的可执行档的种类包括了 Scrip ...

  3. html编写程序常用的,html编写简洁页面表单验证程序.doc

    html编写简洁页面表单验证程序.doc html编写简洁页面表单验证程序 "-//W3C//DTD XHTML 1.0 Transitional//EN" "1/DTD ...

  4. 本地html页面传递表单值,js实现两个页面表单传值并接收

    js 实现两个页面表单传值并接收源码 A页面: function test(){ var s =document.getElementById("txt"); location.h ...

  5. PHP表单注册验证,JavaScript实现注册页面表单校验的实例分享

    下面小编就为大家带来一篇JavaScript 完成注册页面表单校验的实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.步骤分析 第一步:确定事件(onsubmit ...

  6. struts1中页面表单提交给action后页面一片空白,无错无异常

    最近使用struts1在写一个作业,昨天遇到了一个问题:页面表单提交之后,地址栏变为处理的action的地址,即以xxx.do结尾.然后页面一片空白,无错无异常.网上各位大大的总结是 1.在Actio ...

  7. JQuery实现的登陆注册页面表单

    一个用JQuery实现非常友好的登陆注册界面表单,可以学习一下,附上代码:需要引入JQuery库jquery-2.1.1.min.js <!DOCTYPE html> <html l ...

  8. linux中从内存解析xml格式的库,Linux下使用libxml库解析xml文件

    目录 libxml简介 libxml库安装 libxml2中的数据类型和函数 xml文档解析实例 运行结果 libxml简介 libxml是一个用于解析xml文件的库,在各个平台下都能使用,也支持多种 ...

  9. 公司用--页面表单提交用的key是拼接的,保存时action的写法,struts1

    /*** 生管PH设定维护页-保存* @author caohong* @date 2016年11月16日14:55:51*/ public class SaveOrUpdateModifyPHSet ...

最新文章

  1. Eclipse Open J9:Eclipse OMR项目提供的开源JVM
  2. C语言检查列表是否是回文的算法(附完整源码)
  3. UVa 11121 Base -2(负数进制)
  4. volley全然解析
  5. 如何“反编译” Java类文件? [关闭]
  6. Linux快捷键及命令
  7. 泛微OA常用js代码块
  8. PS制作微信公众号封面
  9. 联想电脑如何关闭/开启windows自动更新
  10. WP网站主页备案号存放代码
  11. 如何自学计算机- 计划版 cs
  12. find:paths must precede expression问题及解决
  13. 网线制作:网线和水晶头的接法
  14. “爱运动管理系统”诞生记(4)
  15. 计算机电影制作专业,影视制作专业是学什么的
  16. NIST Big Data Interoperability
  17. 小伙伴们都惊呆了!玩转raid10
  18. 知乎宣布完成2.7亿美元融资 引入前蜜芽合伙人孙伟为CFO
  19. 基于SSH的便利店、超市管理系统
  20. BookshelfB

热门文章

  1. TFRecord简介,原理分析,代码实现?
  2. Java异常处理简单实例
  3. [附源码]计算机毕业设计JAVA面向企业人力资源管理网上智能考勤系统
  4. 机器人 蓝buff 钩_LOL机器人Q增强,能从河道钩走蓝buff,将在S9大放异彩
  5. win10怎么设置pg接口_S71200PLC在Win10中如何设置PC/PG-工业支持中心-西门子中国
  6. vue2 扩展雪碧图
  7. C++浅拷贝(值拷贝)和深拷贝(位拷贝)
  8. 27岁3年社会经历 我对人生态度发生巨大的改变。 执帝都想转行了。
  9. 【MongoDB】MongoDB备份恢复与集群搭建方案
  10. 时光金科php_湖北随州交投·金科府 | 安道设计