2017-05-13 150 views
0

您好我最近從我的編程類昨天學習過文件I/O,並且有這個練習,我們需要從html文件中提取字符串並將其保存在結構中。C從html文件中提取標籤之間的字符串

我創建了一個函數來獲取字符串「Hello World」,但我的問題是我似乎無法獲得第3個和第4個Hello world世界。如果任何人都可以向我解釋爲什麼我的代碼無法檢測到第3次和第4次出現。

這裏是我的代碼

void get_name (char *line, FILE * fPointer, struct Results items) 
{ 
    char *p1; 
    char *p2; 
    char temp[100] = { 0 }; 
    int i = 0; 

    while (fgets (line, 268, fPointer) != NULL) {  //String// 
     p1 = strstr (line, "<span class=\"title\">"); 
     if (p1 == NULL) { 
      printf ("Error p1\n"); 
     } 
     else { 
      printf ("word found\n"); 

      p2 = strstr (p1, "</span>"); 

      if (p2 == NULL) { 
       printf ("Error P2\n"); 
      } 
      else { 
       strncpy (temp, p1 + strlen ("<span class=\"title\">"), 
         p2 - p1 - strlen ("<span class=\"title\">")); 
       strncpy (items[i].item_name, temp, 
         sizeof (temp)/sizeof (temp[0])); 
       printf ("Success!\n"); 
       i++; 
      } 
     } 
    } 
} 

編輯:文本

<span class="title">          Hello world1       </span> 

<span class="title">Hello world2</span>                 

<span class="title">    Hello world3                  
</span> 


<span class="title">                       
Hello world4                       
</span> 
+0

當您的程序無法正常工作時,您希望正確的做法是首先嚐試自己調試它。通過使用調試器。你做到了嗎?你發現了什麼? – kaylum

+0

很難區分換行符來自記事本內容的屏幕截圖。(當使用'fgets'時會大大影響你對內容的搜索)請發佈實際文本(每行以'4-spaces'開頭,因此格式正確)。在某些情況下,「」'甚至不會與'Hello World'在同一行(可能,只是無法說明) –

+0

「尋求調試幫助的問題(」爲什麼這個代碼不能工作?「)必須包含所需的行爲,特定的問題或錯誤,以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者沒有用處。 **如何創建一個最小化,完整和可驗證的示例**](http://stackoverflow.com/help/mcve)。「 –

回答

0

此外在評論中給出的建議,但應注意的是,使用strstr從HTML文檔中提取數據virging關於精神錯亂,similar to using regex to extract HTML

很難看出這個練習的目標是什麼,因爲我看不出你班上還有什麼內容。但是,考慮到結構,流,字符串和函數已經被覆蓋,或許您也已經暴露於使用鏈接器來鏈接並使用外部庫。 提供了幾個選項,用於從HTML文檔中提取數據。這些措施包括:

  • libDOMgumbo-parser並且將解析HTML爲你,讓你方便地找到內容重塑HTML的解析輪其他庫。
  • Many headless browsers,它不僅可以爲你解析HTML,還可以獲取頁面,提交表單,保存cookie並在沒有GUI的情況下執行Javascript。

不服氣使用理智的選擇?好吧,好吧,讓我們來看看你的代碼...

正如你已經證明的理解是fgets讀取(最多)每次通話(即你的變量名,line一條線,觀察你的例子(這應該是作爲文本發佈,而不是圖像)包含開始標記本身就是一條線,您的第一個呼叫定位第一個標記但進一步調用fgets需要獲得內容。即

printf ("word found\n");  // more fgets() is required between here 
p2 = strstr (p1, "</span>"); // and here, because printf(line) shows us 
          // line only contains: "<span class=\"title\">\n" 

這也解釋了爲什麼你的第二個測試用例傳遞(一切都在同一行)和第三個和第四個測試用例是失敗(不是一切都在一行)。爲了解決這個問題,顯然你需要閱讀多個行。

+0

謝謝,我應該試試你的建議!可悲的是我們被限制使用strstr。 – Noobplox23

+0

不幸的是,你的教授正在教你重新發明輪子並發展微妙的解決問題的辦法;我對這樣一位教授很不信任。儘管如此,你需要做的是快速通過並繼續前進,因爲知道你需要*質疑每個練習的動機和理智*。在這種情況下,動機似乎在教你如何使用一種特定的功能。你是否也限制使用'fgets',或者你可以使用'fread'來代替?它可能會更容易使用'fread' ...或甚至'fscanf' ...儘管所有這些選項都是*精神錯亂* ... – Sebivor

+0

是的,我們可以使用fread或fscanf。 – Noobplox23

相關問題