如何获取网页上显示的所有图片的网址列表?

时间:2012-10-07 18:34:31

标签: vb.net

我正在尝试使用VB.NET(2010)来获取特定网页上显示的每个图像的绝对URL。到目前为止,我已经弄清楚如何获取图像标记内的所有URL,如此...

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

完美无缺。但我无法弄清楚如何提取出现在CSS样式中的图像URL。例如......

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

有谁知道这样做的简单方法?我不仅需要从内联CSS代码中提取图像URL,还需要从外部样式表中提取图像URL。

我认为一种方法是获取整个HTML页面的源代码和相关的CSS样式表,然后使用一堆字符串拆分和/或正则表达式解析出所有图像URL。但是,由于我可能会遇到“相对”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

有谁知道我怎么能够完成这样的事情?或者有任何其他想法不涉及令人讨厌的正则表达式和逻辑? :)

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您特别想避免"注意麻烦的正则表达式和逻辑",您是否考虑过HtmlAgilityPack

以下简要代码应显示从bbc.co.uk网站下载的HTML中包含的所有图像网址。扩展此代码以解析从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