2015-08-27 39 views
1

是的,我會同意,在乍看之下,這看起來很像以下的副本:如何始終獲得網站標題,而無需下載所有網頁源

真相被告知......這個問題與這兩個極其相關。不過,我注意到,在研究這個特定主題時,我發現的所有鏈接中的代碼都存在缺陷。

下面是類似於在內容上面的鏈接其他一些鏈接:

如果它是已知的,我得到的網址頁面使用這個特殊的方法,正如這個鏈接中所概述的,但我推測它並不重要:

從第一個鏈接的代碼工作得很好,儘管有一個大問題:

如果,例如,我把URL從這個網站:http://www.dotnetperls.com/imagelist

,並通過它代碼,我有一個修改後的版本:

private static string GetWebPageTitle(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest.Create(url) as HttpWebRequest); 
    HttpWebResponse response = (request.GetResponse() as HttpWebResponse); 
    using (Stream stream = response.GetResponseStream()) 
    { 
     // compiled regex to check for <title></title> block 
     Regex titleCheck = new Regex(@"<title>\s*(.+?)\s*</title>", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
     int bytesToRead = 8092; 
     byte[] buffer = new byte[bytesToRead]; 
     string contents = ""; 
     int length = 0; 
     while ((length = stream.Read(buffer, 0, bytesToRead)) > 0) 
     { 
      // convert the byte-array to a string and add it to the rest of the 
      // contents that have been downloaded so far 
      contents += Encoding.UTF8.GetString(buffer, 0, length); 

      Match m = titleCheck.Match(contents); 
      if (m.Success) 
      { 
       // we found a <title></title> match =] 
       return m.Groups[1].Value.ToString(); 
       break; 
      } 
      else if (contents.Contains("</head>")) 
      { 
       // reached end of head-block; no title found =[ 
       return null; 
       break; 
      } 
     } 
     return null; 
    } 
} 

它返回一個空白的結果,或null。但是,當觀察頁面的HTML代碼時,標題標籤肯定是存在的。

因此,我的問題是:如何修改或修改代碼,無論是修改後的代碼還是其他四個鏈接,都可以從所有網頁獲取網頁標題標題標籤出現,一個例子是這個問題中的最後一個鏈接,一個來自DotNetPerls。

我只是猜測,但我不知道網站是否顯示與其他典型網站不同,例如,也許它第一次加載它時不顯示任何代碼,但瀏覽器實際上加載後重新加載站點第一次透明...

如果可能的話,我寧願與一些工作示例代碼的答案。

+0

我寧願你調試這個多一點。你在緩衝區中收到了什麼? –

+0

@PhilipStuyck你是指哪個緩衝區?我很抱歉,我是「HttpWebRequest」和類似的全球新手。< – Kaitlyn

+0

@PhilipStuyck雖然Rob已經提供了一個工作答案,但我認爲我仍然需要正確回答你。我檢查了,緩衝區是以字節爲單位的,因爲它是一個字節數組。我不知道如何正確轉換該字節數組進行檢查,而不會搞亂文本編碼和格式潛在的... – Kaitlyn

回答

2

它不符合標題,因爲流實際上是原始流,在這種情況下,它已被gzip壓縮。 (在循環內添加Console.WriteLine(內容)以查看)。

要自動解壓縮的流,這樣做:

request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

(解決方案從here採取自動解壓)

+0

你的意思是它直接從URL的頁面得到的「數據」是gzipped? O_o我不太明白...:l – Kaitlyn

+0

@Aria是的,服務器在通過線路發送內容之前壓縮其內容是很常見的 – Rob

+0

哦......我不知道......我該如何實現你的線路,以便它只會嘗試解壓縮,如果它實際上被壓縮?通過檢查它是否顯示爲空? :l – Kaitlyn

相關問題