- Dim regExPattern As String
- ' 为用户输入的完全 Url 分配一个变量。
- urlEntered = Trim(txtURL.Text)
- ' 获取用于不同位置的域名。最好在
- ' Click 事件中设置值,以使在任一 ListView 控件中显示的项
- ' 总和正确的域名关联。如果在其他地方
- ' 分配该值,则用户能更改域名并在 ListView 中双击
- ' 某项,这可能会导致此项的
- ' Url 无效。
- Dim astrDomain() As String = Regex.Split(urlEntered, "/")
- ' 第一个元素 (0) 是“http:”,而第三个元素是
- ' 实际域名。
- domain = astrDomain(0) & "//" & astrDomain(2)
- If optLinks.Checked Then
- ShowStatusIndicators("Connecting to Web page to screen scrape " & _
- "the links. Please stand by...")
- lvwLinks.Items.Clear()
- ' 此处用于分析 HTML 定位点的正则表达式,如,
- ' <a href="http://www.microsoft.com/net">Microsoft</a> 的解释
- ' 如下:
- ' <a HTML 定位点的开始
- ' /s+ 一个或多个空白字符
- ' href 后接 HTML 定位点中的确切文本
- ' /s* 零个或多个空白字符
- ' = 后接 HTML 定位点中的确切文本
- ' /s* 零个或多个空白字符
- ' ""? 零或无引号(转义的)
- ' ( 定义子字符串(定位点 URL)的组的起始点。
- ' [^"" >]+ 任意字符的一个或多个匹配项,
- ' 括号中的字符除外。
- ' ) 定义子字符串的第一组的结束
- ' ""? 零或无引号(转义的)
- ' > 后接 HTML 定位点中的确切文本
- ' (.+) 与任意字符(定位点文本)匹配的组。
- ' </a> 结束 HTML 定位点的确切文本
- '
- ' 警告:如果要在 RegEx Tester 中使用这些模式,
- ' 请确保没有转义双引号。
- regExPattern = "<a/s+href/s*=/s*""?([^"" >]+)""?>(.+)</a>"
- Else
- ShowStatusIndicators("Connecting to Web page to screen scrape the " & _
- "images. Please stand by...")
- images = New System.Collections.Generic.Dictionary(Of String, ImageAttributes)
- lvwImages.Items.Clear()
- ' 擦除图像的正则表达式在概念上类似于
- ' 擦除 HTML 定位点的模式。然而,在这种情况下,
- ' 模式在概念上更为复杂,因为我们要捕获多达
- ' 四种的不同属性,且这些属性能以不同顺序出现。
- '
- ' 为了使此处使用的正则表达式的长度和复杂性保持
- ' 合理,做出下列关于在任何给定网页上
- ' 处理的 HTML <img> 标记的假设:
- '
- ' 1. src 属性总是出现。它是唯一必需的
- ' 属性。
- ' 2. src 属性在 width 和 height 之前。否则,不会抓取
- ' width 和 height。
- ' 3. alt 属性在 width 和 height 之后。否则,不会
- ' 抓取 alt。
- ' 4. Width 和 height 在 src 之后,可采用任意相对顺序。
- ' 模式包括了这两种选项。
- '
- ' 这确保了抓取页上所有图像。但这意味着
- ' 一些其他属性数据可能不会出现。
- '
- ' 此模式中使用的一些关键短语是:
- '
- ' [^>]+ 与除 > 之外的任意字符匹配。这是
- ' 移动到感兴趣的下一个属性的方式。
- ' (?: 启动一个非捕获组。和
- ' 关闭 )? 一起使用可创建可选组(零个或一个
- ' 匹配)。这是使除 src 之外的所有属性可选
- ' 的方式。
- ' | 与 width 和 height 一起用作“或”表达式。注意
- ' 在第一对中 width 在前,而在
- ' 第二对中,顺序反转。
- regExPattern = "<img[^>]+(src)/s*=/s*""?([^ "">]+)""?(?:[^>]+(width|height)/s*=/s*""?([^ "">]+)""?/s+(height|width)/s*=/s*""?([^ "">]+)""?)?(?:[^>]+(alt)/s*=/s*""?([^"">]+)""?)?"
- End If
- Dim re As New Regex(regExPattern, RegexOptions.IgnoreCase)
- Dim m As Match = re.Match(httpSource)
- ' 处理 HTML 源代码。因为源是长字符串,
- ' 所以使用更高效的 Match() 方法而非 Matches
- ' 方法,前者一次只返回一个匹配。Success 属性确定
- ' 是否存在另一匹配。NextMatch() 引发迭代。
- While m.Success
- If optImages.Checked Then
- Dim width As String
- Dim height As String
- ' 因为模式就 width 属性和 height 属性给出了可选顺序,
- ' 请确定哪个属性列在前面,
- ' 然后分配正确的 Group 项值。
- If m.Groups(3).Value.ToLower = "width" Then
- width = m.Groups(4).Value
- height = m.Groups(6).Value
- Else ' Height 属性在前
- width = m.Groups(6).Value
- height = m.Groups(4).Value
- End If
- ' 调用 AddImage 以向哈希表添加一个自定义 ImageAttributes
- ' 对象的实例。有关为何使用哈希表的更多注释,
- ' 请参见 AddImage。
- AddImage(New ImageAttributes(m.Groups(2).Value, _
- m.Groups(8).Value, height, width))
- Else
- ' 创建一个 ListViewItem 对象,并设置第一列的
- ' 文本(“src”)。
- Dim lvi As New ListViewItem()
- lvi.Text = m.Groups(1).Value
- lvwLinks.Items.Add(lvi)
- End If
- ' 继续循环到下一个匹配项。
- m = m.NextMatch()
- End While
- HideStatusIndicators()
- ' 显示控件相应的结果。
- If optImages.Checked Then
- If images IsNot Nothing Then
- FillImagesListView()
- Else
- MsgBox("No images were found whose attributes matched the " & _
- "regular expression.", MsgBoxStyle.Information, Me.Text)
- End If
- Else
- If lvwLinks.Items.Count = 0 Then
- MsgBox("No links were found whose Url matched the regular " & _
- "expression.", MsgBoxStyle.Information, Me.Text)
- End If
- End If
- End If
取网页Links的正表达式
最新推荐文章于 2026-07-03 08:43:14 发布
本文介绍了一种使用正则表达式从网页中抓取链接和图片的方法。通过分析HTML源代码,可以有效地提取出所需的URL链接及图片属性。
2243

被折叠的 条评论
为什么被折叠?



