取网页Links的正表达式

本文介绍了一种使用正则表达式从网页中抓取链接和图片的方法。通过分析HTML源代码,可以有效地提取出所需的URL链接及图片属性。
  1.   Dim regExPattern As String
  2.             ' 为用户输入的完全 Url 分配一个变量。
  3.             urlEntered = Trim(txtURL.Text)
  4.             ' 获取用于不同位置的域名。最好在
  5.             ' Click 事件中设置值,以使在任一 ListView 控件中显示的项
  6.             ' 总和正确的域名关联。如果在其他地方
  7.             ' 分配该值,则用户能更改域名并在 ListView 中双击
  8.             ' 某项,这可能会导致此项的
  9.             ' Url 无效。
  10.             Dim astrDomain() As String = Regex.Split(urlEntered, "/")
  11.             ' 第一个元素 (0) 是“http:”,而第三个元素是
  12.             ' 实际域名。
  13.             domain = astrDomain(0) & "//" & astrDomain(2)
  14.             If optLinks.Checked Then
  15.                 ShowStatusIndicators("Connecting to Web page to screen scrape " & _
  16.                     "the links. Please stand by...")
  17.                 lvwLinks.Items.Clear()
  18.                 ' 此处用于分析 HTML 定位点的正则表达式,如,
  19.                 ' <a href="http://www.microsoft.com/net">Microsoft</a> 的解释
  20.                 ' 如下:
  21.                 '   <a          HTML 定位点的开始
  22.                 '   /s+         一个或多个空白字符
  23.                 '   href        后接 HTML 定位点中的确切文本
  24.                 '   /s*         零个或多个空白字符
  25.                 '   =           后接 HTML 定位点中的确切文本
  26.                 '   /s*         零个或多个空白字符
  27.                 '   ""?         零或无引号(转义的)
  28.                 '   (           定义子字符串(定位点 URL)的组的起始点。
  29.                 '   [^"" >]+    任意字符的一个或多个匹配项,
  30.                 '               括号中的字符除外。
  31.                 '   )           定义子字符串的第一组的结束
  32.                 '   ""?         零或无引号(转义的)
  33.                 '   >           后接 HTML 定位点中的确切文本
  34.                 '   (.+)        与任意字符(定位点文本)匹配的组。
  35.                 '   </a>       结束 HTML 定位点的确切文本               
  36.                 '
  37.                 ' 警告:如果要在 RegEx Tester 中使用这些模式,
  38.                 ' 请确保没有转义双引号。
  39.                 regExPattern = "<a/s+href/s*=/s*""?([^"" >]+)""?>(.+)</a>"
  40.             Else
  41.                 ShowStatusIndicators("Connecting to Web page to screen scrape the " & _
  42.                     "images. Please stand by...")
  43.                 images = New System.Collections.Generic.Dictionary(Of String, ImageAttributes)
  44.                 lvwImages.Items.Clear()
  45.                 ' 擦除图像的正则表达式在概念上类似于
  46.                 ' 擦除 HTML 定位点的模式。然而,在这种情况下,
  47.                 ' 模式在概念上更为复杂,因为我们要捕获多达
  48.                 ' 四种的不同属性,且这些属性能以不同顺序出现。
  49.                 '
  50.                 ' 为了使此处使用的正则表达式的长度和复杂性保持
  51.                 ' 合理,做出下列关于在任何给定网页上
  52.                 ' 处理的 HTML <img> 标记的假设:
  53.                 '
  54.                 '   1. src 属性总是出现。它是唯一必需的
  55.                 '      属性。
  56.                 '   2. src 属性在 width 和 height 之前。否则,不会抓取
  57.                 '      width 和 height。
  58.                 '   3. alt 属性在 width 和 height 之后。否则,不会
  59.                 '      抓取 alt。
  60.                 '   4. Width 和 height 在 src 之后,可采用任意相对顺序。
  61.                 '      模式包括了这两种选项。
  62.                 '
  63.                 ' 这确保了抓取页上所有图像。但这意味着
  64.                 ' 一些其他属性数据可能不会出现。
  65.                 '
  66.                 ' 此模式中使用的一些关键短语是:
  67.                 
  68.                 '   [^>]+       与除 > 之外的任意字符匹配。这是
  69.                 '               移动到感兴趣的下一个属性的方式。
  70.                 '   (?:         启动一个非捕获组。和
  71.                 '               关闭 )? 一起使用可创建可选组(零个或一个
  72.                 '               匹配)。这是使除 src 之外的所有属性可选
  73.                 '               的方式。
  74.                 '   |           与 width 和 height 一起用作“或”表达式。注意
  75.                 '               在第一对中 width 在前,而在
  76.                 '               第二对中,顺序反转。
  77.                 regExPattern = "<img[^>]+(src)/s*=/s*""?([^ "">]+)""?(?:[^>]+(width|height)/s*=/s*""?([^ "">]+)""?/s+(height|width)/s*=/s*""?([^ "">]+)""?)?(?:[^>]+(alt)/s*=/s*""?([^"">]+)""?)?"
  78.             End If
  79.             Dim re As New Regex(regExPattern, RegexOptions.IgnoreCase)
  80.             Dim m As Match = re.Match(httpSource)
  81.             ' 处理 HTML 源代码。因为源是长字符串,
  82.             ' 所以使用更高效的 Match() 方法而非 Matches 
  83.             ' 方法,前者一次只返回一个匹配。Success 属性确定
  84.             ' 是否存在另一匹配。NextMatch() 引发迭代。
  85.             While m.Success
  86.                 If optImages.Checked Then
  87.                     Dim width As String
  88.                     Dim height As String
  89.                     ' 因为模式就 width 属性和 height 属性给出了可选顺序,
  90.                     ' 请确定哪个属性列在前面,
  91.                     ' 然后分配正确的 Group 项值。
  92.                     If m.Groups(3).Value.ToLower = "width" Then
  93.                         width = m.Groups(4).Value
  94.                         height = m.Groups(6).Value
  95.                     Else ' Height 属性在前
  96.                         width = m.Groups(6).Value
  97.                         height = m.Groups(4).Value
  98.                     End If
  99.                     ' 调用 AddImage 以向哈希表添加一个自定义 ImageAttributes
  100.                     ' 对象的实例。有关为何使用哈希表的更多注释,
  101.                     ' 请参见 AddImage。
  102.                     AddImage(New ImageAttributes(m.Groups(2).Value, _
  103.                         m.Groups(8).Value, height, width))
  104.                 Else
  105.                     ' 创建一个 ListViewItem 对象,并设置第一列的
  106.                     ' 文本(“src”)。
  107.                     Dim lvi As New ListViewItem()
  108.                     lvi.Text = m.Groups(1).Value
  109.                     lvwLinks.Items.Add(lvi)
  110.                 End If
  111.                 ' 继续循环到下一个匹配项。
  112.                 m = m.NextMatch()
  113.             End While
  114.             HideStatusIndicators()
  115.             ' 显示控件相应的结果。
  116.             If optImages.Checked Then
  117.                 If images IsNot Nothing Then
  118.                     FillImagesListView()
  119.                 Else
  120.                     MsgBox("No images were found whose attributes matched the " & _
  121.                         "regular expression.", MsgBoxStyle.Information, Me.Text)
  122.                 End If
  123.             Else
  124.                 If lvwLinks.Items.Count = 0 Then
  125.                     MsgBox("No links were found whose Url matched the regular " & _
  126.                     "expression.", MsgBoxStyle.Information, Me.Text)
  127.                 End If
  128.             End If
  129.         End If
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值