2012-10-07 141 views
2

我正在嘗試使用VB.NET(2010)獲取出現在特定網頁上的每個圖像的絕對URL。到目前爲止,我已經想出瞭如何獲取圖片標籤中的所有網址,例如...如何獲取網頁上出現的所有圖片的網址列表?

 For Each SeparateImage As HtmlElement In WebBrowser1.Document.Images 
     ListBox1.Items.Add(SeparateImage.GetAttribute("src")) 
     Next 

這很好用。但我無法弄清楚的是如何提取出現在CSS樣式中的圖片網址。例如...

 background-image:url('image.jpg'); 

有沒有人知道一個簡單的方法來做到這一點?我不僅需要從內聯CSS代碼中提取圖片URL,還需要從外部樣式表中提取圖片URL。

我認爲這樣做的一種方法是獲取整個HTML頁面和相關CSS樣式表的源代碼,然後使用一堆字符串分割和/或正則表達式解析出所有圖像URL。但是,要弄清楚每張圖片的正確的絕對網址可能會相當複雜,因爲我可能會遇到「相對」URL路徑的所有不同可能性。例如...

background-image:url('image.jpg'); 
    background-image:url('/image.jpg'); 
    background-image:url('./image.jpg'); 
    background-image:url('../image.jpg'); 
    background-image:url('../otherdirectory/image.jpg'); 

所以......這將是非常好的,如果這樣的事情存在?

 For Each CSS_Style As HtmlElement In WebBrowser1.Document.Styles 
     ListBox1.Items.Add(CSS_Style.GetAttribute("background-image")) 
     Next 

有誰知道我如何能夠完成這樣的事情?還是有任何其他想法不涉及大量的正則表達式和邏輯? :)

在此先感謝!

回答

0

如果你正在專門尋找避免「令人麻木的正則表達式和邏輯量」,你考慮過HtmlAgilityPack

以下簡短代碼應顯示從bbc.co.uk網站下載的HTML中包含的所有圖像URL。擴展此代碼以解析HTML文檔中引用的任何CSS文件的圖像鏈接應該不會太困難。

Imports HtmlAgilityPack 

Module Module1 

    Sub Main() 
     Dim mainUrl As String = "http://www.bbc.co.uk" 
     Dim doc As HtmlDocument 
     doc = New HtmlDocument() 
     Dim sourceString As String = New System.Net.WebClient().DownloadString(mainUrl) 
     doc.LoadHtml(sourceString) 
     For Each link As HtmlNode In doc.DocumentNode.SelectNodes("//img[@src]") 
      Dim linkAddress = GetAbsoluteUrl(link.Attributes("src").Value, mainUrl) 
      Console.WriteLine("Image: {0}", linkAddress) 
     Next 
    End Sub 
    ' 
    Function GetAbsoluteUrl(partialUrl As String, baseUrl As String) 
     Dim myUri = New Uri(partialUrl, UriKind.RelativeOrAbsolute) 
     If (myUri.IsAbsoluteUri = False) Then 
      myUri = New Uri(New Uri(baseUrl), partialUrl) 
     End If 
     GetAbsoluteUrl = myUri 
    End Function 

End Module 
相關問題