【问题标题】:How to get the link from these images and put all in PictureBoxes?如何从这些图像中获取链接并将所有内容放入 PictureBoxes 中?
【发布时间】:2018-10-18 20:48:33
【问题描述】:

我搜索了 9 个小时来获取这些图片的链接并将所有内容放在PictureBoxes 中,我尝试了几次以获取“通过 id、标签名称获取元素...”我很困惑,这种标签层次结构非常困难,因为还有其他几个同名的标签。

HTML

<ul class="FirstClass" id="pageID">
    <li class="coverPage">...</li>

    <li class="coverPage">
    <a href="https://myfirstsite.com/post" title="My Site Page">
    <img src="https://myfirst.com/post/image.jpg" title="Image of This Post">
    <li class="coverPage">...</li>

    <li class="coverPage">

        <a href="https://myfirstsite.com/post" title="My Site Page">
        <img src="https://myfirst.com/post/image.jpg" title="Image of This Post">

        </li>

想法

试试

If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
    If WebBrowser1.Url.ToString = ("https://myfirst.com/") Then
        Dim ImgTags As HtmlElementCollection = WebBrowser1.Document.Body.GetElementsByTagName("img")

        For Each element As HtmlElement In ImgTags
            Dim ImgUri As String = element.GetAttribute("src")
            PictureBox1.ImageLocation = ImgUri
        Next
    End If
End If

试试 2 ( ??? :s)

Dim PicsTag As New ArrayList
Dim countPics As Integer = 0

For Each item As HtmlElement In WebBrowser1.Document.Body.GetElementsByTagName("img")
    PicsTag.Add(item.InnerText)
    Me.Controls("Label" & countPics.tostring).Text = PicsTag(0)
    countPics = +1
    ListBox1 ???
Next

*注意**:有没有工具可以提取这些标签并将其转换为VB.NET?

【问题讨论】:

  • 不用担心 Html 标签嵌套。订阅了WebBrowser.DocumentCompleted 事件。在事件处理程序中,插入一个检查:If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then (...) End If。文档完成后,If/End If 块中的代码将执行。在那里,您可以获得所有 IMG 标签的集合:Dim ImgTags As HtmlElementCollection = WebBrowser1.Document.Body.GetElementsByTagName("img")。迭代集合:For Each element As HtmlElement In ImgTags获取链接Dim ImgUri as string = element.GetAttribute("src")
  • 然后你就可以下载图片了(WebClient在这里就派上用场了)。或设置PicureBox.ImageLocation = ImgUri
  • 吉米,感谢您的回复!我忘了提一个细节,我会纠正我的问题。
  • 您一遍又一遍地设置同一 PictureBoxImageLocation 属性。如果您打算获取所有图像(未知编号),则需要List(Of PictureBox)。提取到List(Of String) 的所有链接,为每个图像链接创建一个新的PictureBox,设置其属性(主要是ImageLocationSizeSizeMode),然后将其添加到List(Of PictureBox)。将所有PictureBoxes 插入List 中的TableLayoutPanel(用作演示助手),就完成了。
  • 我从未使用过图片框列表 jimi :/

标签: vb.net winforms webbrowser-control


【解决方案1】:

从网页中提取非通用信息(特定元素和相关细节)需要分析HTML 结构。
主要目标是确定描述这些元素的容器分布的通用逻辑。这通常不是一项艰巨的任务,因为这些元素(链接、文本、图像)的来源(很可能)是某种数据库。元素按顺序组装/包装HTML标签中进行展示,使用重复的模式。

您所指的网页具有以下结构:

<Body> --
       -- Non-interesting elements
       -- <DIV class="[className]"> containers of the elements we are looking for
          -- <A title="" href=""> Anchor linking to a details page. Contains a Title text and the
                                  details page URI. "title" and "href" are attributes of the <A> tag
              -- <IMG src="">  URI of the Image. It could be a complex structure.
                               In this case, a simple, direct link

              -- <>  Non-interesting sub-elements of <A>
          -- <> Non-interesting sub-elements of <DIV>

我们对 [className] 类的所有 &lt;DIV&gt; 元素感兴趣,因为它们是我们所追求的元素的容器(父级)。
因此,第一步是提取所有这些&lt;DIV&gt; 元素。
这很容易使用GetElementsByTagName() 方法完成。此方法适用于每个 HTML 元素,因为每个 HTML 元素都可以是其他嵌套元素的父元素。

.Document.Body.GetElementsByTagName("DIV").OfType(Of HtmlElement).
          Where(Function(t) t.GetAttribute("[className]") = "[The className we're after]")

此 Linq 查询将返回具有所需 [className] 的所有元素。 要提取子标签 &lt;A&gt;&lt;IMG&gt; 中包含的信息,我们只需对找到的每个元素重复相同的过程:

For Each [<DIV> element] As HtmlElement In [<DIV> elements collection]
    Dim Anchor As HtmlElement = [<DIV> element].GetElementsByTagName("A").OfType(Of HtmlElement).First()
    Dim IMG As HtmlElement = [<DIV> element].GetElementsByTagName("IMG").OfType(Of HtmlElement).First()
Next

然后我们使用GetAttribute() 方法提取元素的属性。
当然,所有属性都是字符串值。

 Dim AttributeValue as String = [Element].GetAttribute("[AttributeName]")

什么WebBrowser类或WinForms/WPF控件用于获取HTML页面,必须订阅它的DocumentCompleted事件。
每次 WebBrowser 完成文档已知部分的合成时都会引发此事件。
当页面包含在不同时刻更新页面的 IFramesScripts 时,DocumentCompleted 事件会多次引发。

WebBrowser.ReadyStateWebBrowserReadyState.Complete 时,文档已完全加载。

一个例子:

 Dim wBrowser As WebBrowser = New WebBrowser()
 wBrowser.ScriptErrorsSuppressed = True
 AddHandler wBrowser.DocumentCompleted, AddressOf wBrowser_DocumentCompleted
 WebLinkBrowser.Navigate("[Web URI]")

 Dim DIVClassName As String = "[Some className]"

 '(...)

 Private Sub wBrowser_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
    Dim Browser As WebBrowser = CType(sender, WebBrowser)
    If Browser.ReadyState = WebBrowserReadyState.Complete Then

        Dim DivTags As List(Of HtmlElement) =
            Browser.Document.Body.GetElementsByTagName("DIV").
                OfType(Of HtmlElement).
                Where(Function(t) t.GetAttribute("className") = DIVClassName).ToList()

        For Each element As HtmlElement In DivTags
            Dim elmAnchor As HtmlElement = element.GetElementsByTagName("A").OfType(Of HtmlElement).First()
            Dim AnchorTitle As String = elmAnchor.GetAttribute("title")
            Dim AnchorURI As String = elmAnchor.GetAttribute("href")

            Dim elmImage As HtmlElement = element.GetElementsByTagName("IMG").OfType(Of HtmlElement).First()
            Dim ImgSource as String = elmImage.GetAttribute("src")
        Next
    End If
End Sub

Sample project of a Web Scraper(Google 云端硬盘)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2016-06-11
    • 2013-07-18
    • 2023-04-11
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多