如何从libcurl获取URL的片段部分?

时间:2014-07-13 16:11:10

标签: c++ libcurl

我被重定向到地址为http://example.com#foo=bar的网页。我想得到foo=bar部分内容。整件事也没关系。

我发现了这件事:

char * url;
curl_easy_getinfo(myHandle, CURLINFO_EFFECTIVE_URL, &url);

我不熟悉英语以便自己查找信息。每次我想找到它,我都会找到有关将页面变为字符串变量的信息。

代码:

std::string readBuffer;
curl_global_init( CURL_GLOBAL_ALL);
CURL * myHandle;
CURLcode result;
myHandle = curl_easy_init();
curl_easy_setopt(myHandle, CURLOPT_COOKIEJAR, "coo.txt");
curl_easy_setopt(myHandle, CURLOPT_COOKIEFILE, "coo.txt");
curl_easy_setopt(myHandle, CURLOPT_URL, "https://www.google.ru/#q=stack");
curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(myHandle, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(myHandle, CURLOPT_FOLLOWLOCATION, 1L);
result = curl_easy_perform(myHandle);
char * ch_cur_url;
result = curl_easy_getinfo(myHandle, CURLINFO_EFFECTIVE_URL,
        &ch_cur_url);
printf("%s\n", ch_cur_url);

输出https://www.google.ru/

当我想要https://www.google.ru/#q=stack

1 个答案:

答案 0 :(得分:1)

根据错误报告(12),

cURL会在发出请求之前从网址中删除“片段标识符”。另见this patch。因此,“片段标识符”不能作为CURLINFO_EFFECTIVE_URL的一部分。

如果“片段标识符”作为重定向的一部分返回(例如Location HTTP标头)并且您无法以其他方式获取它,那么您可以使用调试模式来查看通信在cURL和服务器之间并自己提取“片段标识符”。为此,您需要设置CURLOPT_DEBUGFUNCTIONCURLOPT_HEADERFUNCTION

P.S。一点建议:谷歌搜索相关信息非常容易。我做的第一件事就是学习#foo=bar的“官方”名称。为了得到它,我在URL访问了维基百科并被带到了Fragment identifier。之后,谷歌搜索“卷曲片段”网络相关部分。如果您正在寻找某些东西,请了解它的正确名称。