我正在制作一個網路爬蟲,我正處于需要決議傳入資料的地步。一切都很順利,直到我不得不在字串中找到子字串的所有實體。我能夠得到一些作業,但它沒有給我我想要的完整字串(這是一個完整的<p></p>標簽)。
done = 0;
while (done == 0) {
if ((findSpan = strstr(serverResp, "<p")) != NULL) {
printf("%s\n", findSpan);
if ((findSpanEnd = strstr(findSpan, "</p>")) != NULL) {
strcpy(serverResp, findSpanEnd);
strcpy(findSpanEnd 4, "");
printf("after end tag formattng %s\n", findSpan);
}
} else {
done = 1;
}
}
在結束標記格式之后應該給我一個結果,<p>insert text here</p>但是相反,我得到了這樣的結果:
<p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
after end tag formatting <p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
after end tag formatting dy>
</html>
該網站的代碼如下所示:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>ignore this</h1>
<p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
uj5u.com熱心網友回復:
if ((findSpanEnd = strstr(findSpan, "</p>")) != NULL) {
strcpy(serverResp, findSpanEnd);
這是沒有意義的。strstr按要求查找"</p>";但是你不能把它傳遞給strcpy喜歡它。strstr根本不分配新字串;它只回傳舊位置中的位置。
列印出所有<p>標簽的例程如下所示(請注意,這假定沒有嵌套<p>標簽):
for (char *ptr = serverResp; ptr = strstr(ptr, "<p");)
{
char *finger = strchr(ptr, '>');
if (!finger) break;
finger;
ptr = strstr(finger, "</p>");
if (!ptr) {
fwrite(finger, 1, strlen(finger), stdout);
} else {
fwrite(finger, 1, ptr - finger, stdout);
}
fputs("\r\n", stdout);
}
strstr技術: for 回圈中的呼叫定位下一個<p>標簽,strchr找到它的結尾,然后另一個strstr找到關閉</p>因為回傳指標指向原始字串,我們使用fwrite而不是printf產生輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/433684.html
