C++ 如何创建html树?
我需要挖掘一些html文件,我想首先将它们转换成一行一个标记的树的可读形式。然而,我没有html方面的经验。有人能更正我的代码并指出我忘记的规则吗 我的代码不适用于现实生活中的页面。在程序执行结束时,嵌套计数器应设置为0,因为程序应保留它遇到的所有嵌套标记。事实并非如此。对于一个facebook页面来说,有2000多个标签保持打开状态 在有人建议我使用图书馆之前,我还没有看到任何好的图书馆。对于我的页面,转换成xml不知何故失败了,htmlcxx库并没有合适的文档C++ 如何创建html树?,c++,html,c,parsing,C++,Html,C,Parsing,我需要挖掘一些html文件,我想首先将它们转换成一行一个标记的树的可读形式。然而,我没有html方面的经验。有人能更正我的代码并指出我忘记的规则吗 我的代码不适用于现实生活中的页面。在程序执行结束时,嵌套计数器应设置为0,因为程序应保留它遇到的所有嵌套标记。事实并非如此。对于一个facebook页面来说,有2000多个标签保持打开状态 在有人建议我使用图书馆之前,我还没有看到任何好的图书馆。对于我的页面,转换成xml不知何故失败了,htmlcxx库并没有合适的文档 #include <cs
#include <cstdio>
char get_char( FILE *stream ) {
char c;
do
c = getc(stream);
while ( c == ' ' || c == '\n' || c == '\t' || c == '\r' );
return c;
}
void fun( FILE *stream, FILE *out ) {
int counter = -1;
char c;
do {
c = get_char(stream);
if ( c == EOF )
break;
if ( c != '<' ) { // print text
for ( int i = counter + 1; i; --i )
putc( ' ', out );
fprintf( out, "TEXT: " );
do {
if ( c == '\n' )
fprintf( out, "<BR>" ); // random separator
else
putc( c, out );
c = getc( stream );
} while ( c != '<' );
putc( '\n', out );
}
c = getc( stream );
if ( c != '/' ) { // nest deeper
++counter;
for ( int i = counter; i; --i )
putc( ' ', out );
} else { // go back in nesting
--counter;
// maybe here should be some exception handling
do // assuming there's no strings in quotation marks here
c = getc( stream );
while ( c != '>' );
continue;
}
ungetc( c, stream );
do { // reading tag
c = getc(stream);
if( c == '/' ) { // checking if it's not a <blahblah/>
c = getc(stream);
if ( c == '>' ) {
--counter;
break;
}
putc( '/', out );
putc( c, out );
} else if ( c == '"' ) { // not parsing strings put in quotation marks
do {
putc( c, out ); c = getc( stream );
if ( c == '\\' ) {
putc( c, out ); c = getc( stream );
if ( c == '"' ) {
putc( c, out ); c = getc( stream );
}
}
} while ( c != '"' );
putc( c, out );
} else if ( c == '>' ) { // end of tag
break;
} else // standard procedure
putc( c, out );
} while ( true );
putc( '\n', out );
} while (true);
fprintf( out, "Counter: %d", counter );
}
int main() {
const char *name = "rfb.html";
const char *oname = "out.txt";
FILE *file = fopen(name, "r");
FILE *out = fopen(oname, "w");
fun( file, out );
return 0;
}
#包括
char get_char(文件*流){
字符c;
做
c=getc(流);
而(c=''| | c='\n'| | c='\t'| | c='\r');
返回c;
}
void fun(文件*流,文件*出){
int计数器=-1;
字符c;
做{
c=获取字符(流);
如果(c==EOF)
打破
如果(c!=''){
--计数器;
打破
}
putc(“/”,out);
putc(c,out);
}else如果(c==“”){//不解析放在引号中的字符串
做{
putc(c,out);c=getc(流);
如果(c=='\\'){
putc(c,out);c=getc(流);
如果(c==“”){
putc(c,out);c=getc(流);
}
}
}而(c!=“”);
putc(c,out);
}else如果(c=='>'){//标记的结尾
打破
}else//标准程序
putc(c,out);
}虽然(正确);
putc('\n',out);
}虽然(正确);
fprintf(输出,“计数器:%d”,计数器);
}
int main(){
const char*name=“rfb.html”;
const char*oname=“out.txt”;
FILE*FILE=fopen(名称,“r”);
FILE*out=fopen(oname,“w”);
乐趣(文件,外出);
返回0;
}
HTML!=XML
标记可以是非闭合的,例如
被认为等于
HTML!=XML
标记可以是非封闭的,例如
被认为等同于
这样有趣而有用的主题,几乎没有答案。真奇怪
很难找到好的C++ HTML解析器!我试图引导正确的方向……它可能会帮助你继续前进……/P>
Lib curl页面有一些源代码可以让您使用。文档遍历dom树。您不需要xml解析器。在格式错误的html上不会失败
另一个选项是htmlcxx。从网站描述:
HTMLCXX是C++的一个简单的非验证CSS1和HTML解析器。 可以尝试像tidyHTML-(免费)这样的LIB
如果您使用的是Qt4.6,则可以使用QWebElement。一个简单的示例: 框架->设置HTML(HTML); QWebElement文档=框架->文档元素(); QList imgs=document.findAll(“img”);这是另一个例子。如此有趣和有用的话题,几乎没有答案。真奇怪 很难找到好的C++ HTML解析器!我试图引导正确的方向……它可能会帮助你继续前进……/P> Lib curl页面有一些源代码可以让您使用。文档遍历dom树。您不需要xml解析器。在格式错误的html上不会失败 另一个选项是htmlcxx。从网站描述:
HTMLCXX是C++的一个简单的非验证CSS1和HTML解析器。 可以尝试像tidyHTML-(免费)这样的LIB
如果您使用的是Qt4.6,则可以使用QWebElement。一个简单的示例: 框架->设置HTML(HTML); QWebElement文档=框架->文档元素(); QList imgs=document.findAll(“img”); 这里是另一个例子