Linux c使用gumbo库解析页面表单信息(三)
前面说了那么多,终于说到如何解析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=;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[]; 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=;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/
Linux c使用gumbo库解析页面表单信息(三)的更多相关文章
- Linux c使用gumbo库解析页面表单信息(一)
一.gumbo介绍 gumbo是一个由谷歌开发的,能够解析html页面的库.功能稳定可靠,使用起来十分方便. 二.gumbo安装 (1)从https://github.com/google/gumbo ...
- Linux c使用gumbo库解析页面表单信息(二)
一.如何在程序当中使用gumbo? 要想在代码中使用gumbo,仅仅包含gumbo头文件是不够的,必须在编译程序的时候加上-lgumbo选项,编译程序才会链接到gumbo库上面. 这是我编译gumbo ...
- 使用JQuery.Validate插件来校验页面表单有效性
使用JQuery.Validate插件来校验页面表单有效性1. [代码] 常见的注册表单元素 <form action="#" method="post" ...
- html 页面表单如果是disabled,则不能提交到服务器端,request.getParameter得到的将为null
html 页面表单如果是disabled,则不能提交到服务器端,request.getParameter得到的将为null 解决方法:使用hidden 利用javascript赋值,传递到后台
- 把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)
#把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进) ##背景 项目中经常需要把JSON数据填充到页面表单,一开始我使用easyui自带的form load方法,觉得效率很低,经 ...
- 记录ASP.NET页面表单初始状态(主要是为了前台可以根据这个判断页面是否变动了)
把页面表单状态记录到HiddenField中. 这里只提供后台代码, 前台逻辑根据需求自由定义. 存放值的ViewState: protected Dictionary<string, stri ...
- SpringMVC接收页面表单参数-java-电脑编程网
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- JavaScript学习——使用JS完成注册页面表单校验
1.步骤分析 第一步:确定事件(onsubmit)并为其绑定一个函数 第二步:书写这个函数(获取用户输入的数据<获取数据时需要在指定位置定义一个 id>) 第三步:对用户输入的数据进行判断 ...
- spring mvc 接收页面表单List
很少写博客,如果写的不好请多多包涵! 最近在用Spring mvc时遇到一个问题,在网上搜了很多资料.几乎没看到解决办法! 例如:当我们在做批量添加或者更新时,在Controller层接收表单数据的问 ...
随机推荐
- python 基于numpy的线性代数运算
import numpy as np A = [[1,2],[2,1]] np.linalg.inv(A) #计算矩阵A的逆矩阵. #显示结果 [[-0.33333333 0.66666667] [ ...
- React Native之配置开发环境
安装前注意: 1)在Max OS X 10.11(El Capitan)版本中,homebrew在安装软件时可能会碰到/usr/local目录不可写的权限问题.可以使用下面的命令修复: sudo ch ...
- 外星人入侵游戏(python代码)
https://github.com/ehmatthes/pcc/tree/master/chapter_12/images
- 王之泰201771010131《面向对象程序设计(java)》第十三周学习总结
第一部分:理论知识学习部分 第11章 事件处理 11.1 事件处理基础 a)事件源(event source):能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事件源是一个 能够注册监听 ...
- IOS runtime运行机制详解(一)
OC运行机制是指,可以运行的时候动态调用函数.因为C语言必须在编译的时候就决定调用哪个函数. 我们平时写的OC代码,它在运行的时候也是转换成了runtime的方式运行的.任何方法调用本质:就是发送一个 ...
- LeetCode03 最长无重复子串
题目 给定一个字符串,找出不含有重复字符的最长子串的长度. 解答 刚开始以为只是一遍遍历后来的字符和前面一样便开始算新子串,给的案例都过了,但是卡在了"dvdf" 后来经过重重试验 ...
- 从Scratch到Python之角色与造型
从Scratch到Python之角色与造型 继续讲解通过python turtle从积木编程过渡到代码编程的技巧.角色是scratch中很重要的主角,每个角色可以更换不同的造型或者音效,堆叠不同的积木 ...
- 给video添加自定义进度条
思路: 1.进度条,首先要知道视频的总长度,和视频的当前进度,与其对应的便是进度条的总长度和当前的长度,两者比值相等 2.获取视频的总长度(单位是秒),获取当前进度 3.要实现的功能,首先是进度条根据 ...
- Vivado SDK ,调用math.h函数的时候出现 undefined reference to `xxx' ,解决方案
在Vivado SDK进行软件设计的时候,如调用math.h函数的时候出现 undefined reference to `sqrt' ,原因有以下情况: 1.没有添加需调用的头文件 解决方案:添加对 ...
- Rancher2.0与DataDog集成部署
目录 一.简要介绍 二.注意事项 三.部署过程 四.运行截图 五.参考链接 一.简要介绍: 看了Rancher中文官网上的一篇关于DataDog部署的文章,自己尝试了一下,没有成功,主要是自己对Dat ...