在my last question中,我询问了如何解析HTML页面中的链接。由于我还没有找到解决方案,我认为我在此期间尝试了其他方法:搜索每个<a href=
并复制其中的任何内容,直到我点击</a>
。
现在,我的C有点生疏,但我确实记得我可以使用strstr()
来获取该字符串的第一个实例,但我如何得到其余的呢?
感谢任何帮助。
PS:不。这不是学校的家庭作业或类似的东西。你知道吗。
答案 0 :(得分:4)
您可以使用循环:
char *ptr = haystack;
size_t nlen = strlen (needle);
while (ptr != NULL) {
ptr = strstr (ptr, needle);
if (ptr != NULL) {
// do whatever with ptr
ptr += nlen; // hat tip to @larsman
}
}
答案 1 :(得分:3)
为什么不使用内置了非常好的HTML解析器的libxml?
答案 2 :(得分:1)
好的,原来的答案和我的评论似乎需要比评论部分更多的信息,所以我决定创建一个新答案。
首先,你正在尝试做什么 IS 已经是一个编程任务,将需要一些编程能力,具体取决于你的确切需求。
其次,提供了一些答案,建议您使用char查找和regexp循环。如上所述,这些都是可怕的容易出错的方法,例如here。
现在解析HTML / XML的常用方法是使用为此设计的外部库。实际上,这些库现在已经成为标准的,并且在许多编程语言中它们已经内置。
根据您的特殊需求,我在C和XPath上都生锈了,但它应该大致如下:
我找到了其他一些例子,也许这个更好:http://xmlsoft.org/example.html
正如你在那里看到的那样,有一个XML文档(没关系,因为HTML只是XML的子集,你的HTML文档也应该有用)。
在Python或类似的语言中,这将非常容易,在某些伪代码中,这看起来像这样:
p=new HTMLParser
p->load(my html document)
resultset=p->XPath_Search("//a") # this will find all A elements in the HTML document
for each result of resultset:
write(result.href)
end for
这通常会写出文档中所有A元素的HREF部分。 关于你可以使用XPath的一个体面的教程是例如here。
我担心在C中这会有点复杂,但这个想法是一样的,它是一个编程任务。
如果这是一些快速而肮脏的工作,您可以使用建议的strstr()或regexp搜索,而不使用外部库。但是,请记住,根据您的确切任务,您很可能会错过许多外发链接或误读其内容。
答案 3 :(得分:0)
C字符串只是指向第一个字符的指针;获得下一场比赛只需再次调用它并将指针传递给上一场比赛的结束。
答案 4 :(得分:0)
以下是我要做的事情(未经测试,只是我的想法):
char* hRef_start = "<a href=";
char* hRef_end = "</a>";
假设您的文字在
中char text[1000];
char * first = strstr(text , hRef_start);
if(first)
{
char * last = strstr(first , hRef_end);
if(last)
last--;
else
//Error here.
char * link = malloc((last - first + 2) * sizeof(char));
copy_link(link , first , last);
}
void copy_link(char * link , const char * first , const char * last)
{
while(first < last)
{
*link = *first;
++first;
}
*link = 0;
}
您应该检查malloc()
是否已成功,并确保free()
,同时确保copy_link()
没有任何参数null
。