【问题标题】:split html by tags按标签拆分html
【发布时间】:2013-07-30 09:16:51
【问题描述】:

我想通过标记分隔符将 html 页面拆分为多个部分:例如 <img<div>。 我尝试了以下代码,但它不起作用:

char source[MAXBUFLEN + 1];
FILE *fp = fopen("source.html", "r");
if (fp != NULL)
{
    size_t newLen = fread(source, sizeof(char), MAXBUFLEN, fp);
    if (newLen == 0) {
        fputs("Error reading file", stderr);
    } else {
        source[++newLen] = '\0'; /* Just to be safe. */
    }
}
fclose(fp);

//not working
char* strArray[10];
int i = 0;
char *token = strtok(source, "<img");
while(token != NULL)
{
    strcpy(strArray[i++], token);

    token = strtok(NULL, "<img");
}

printf("%s\n", strArray[3]);

我做错了什么?除了strtok还有其他方法可以使用吗?

【问题讨论】:

  • strtok() 的第二个参数实际上是您感兴趣的所有分隔符的列表。我建议拆分“img 开头跨度>
  • 除非你真的需要自己实现,否则我建议你查看 libxml:xmlsoft.org。否则,您将不得不使用 strtok 解析“”。

标签: c split


【解决方案1】:

正如Daren 已经发布的那样,strtok() 不会做你想做的事。你可以使用

char *ptr = strstr( source, "<img" );

而不是找到第一个标签,然后

ptr = strstr(ptr+4, "<img" ); // search starts direcly behind the previous "<img" 
                              // maybe you can find a better offset

为下一次发生。

另外,你的台词

strcpy(strArray[i++], token);

会因为没有分配给指针的内存而崩溃。

【讨论】:

  • 是的,你是对的,现在它可以正确提取,但是我想添加到数组中的部分所有结果都不起作用。我只需要数组中的第四个元素。您知道不使用数组仅保存第 4 次出现的其他方法吗?谢谢
  • 你的意思是第四个 标签吗?然后你可以做一个像for( i=0; ptr=source; i&lt;4 &amp;&amp; (ptr=strstr(ptr,"&lt;img")) != NULL; i++,ptr+=4 ); 这样的循环。如果ptr != NULL 之后你找到了你的标签。
  • 它说了什么?糟糕,我刚刚看到一个错误:将i=0; ptr=source 替换为i=0, ptr=source。当然两者都属于初始化部分。
【解决方案2】:
char *strtokByWord_r(char *str, const char *word, char **store){
    char *p, *ret;
    if(str != NULL){
        *store = str;
    }
    if(*store == NULL) return NULL;
    p = strstr(ret=*store, word);
    if(p){
        *p='\0';
        *store = p + strlen(word);
    } else {
        *store = NULL;
    }
    return ret;
}
char *strtokByWord(char *str, const char *word){
    static char *store = NULL;
    return strtokByWord_r(str, word, &store);
}

替换

char *token = strtok(source, "<img");
...
token = strtok(NULL, "<img");

char *token = strtokByWord(source, "<img");
...
token = strtokByWord(NULL, "<img");

【讨论】:

    【解决方案3】:

    strtok 的第二个参数是分隔符列表。这些中的每一个都将用于将字符串拆分为标记。我不认为它做你认为它做的......

    如果您想将 html 文件解析为令牌,您可以查看 lex...

    您想要的输出是什么?您有输入的测试用例吗?

    您的代码应生成以下内容:

    输入:

    <html><img src="test.png"/></html>
    

    输出:

    • ""
    • “ht”
    • “l>”
    • " src=\"test.pn"
    • "\"/>"
    • "/ht"
    • “l>”

    我不认为那是你想要的......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2021-06-04
      • 1970-01-01
      相关资源
      最近更新 更多