Visual Basic网页爬取:正确提取Side字段目标值的技术问题
问题解决:提取网页中的Side目标值
我开发了一个网页爬取程序,将爬取结果展示在DataGridView中,但因提取逻辑存在问题,结果显示异常且无法在正确位置结束展示。当前使用的ExtractSide函数通过正则表达式提取网页源码中的Side字段,但无法正确提取出Both、None、Alliance或Horde这四个目标值。
原函数代码:
Private Function ExtractSide(sourceCode As String) As String Dim pattern As String = "Side: (.*?) [/li]" Dim match As Match = Regex.Match(sourceCode, pattern) If match.Success Then Return match.Groups(1).Value Else Return String.Empty End If End Function
网页中Side字段的四种格式:
Side: Both[/li] Side: None[/li] Side: [span class=icon-alliance]Alliance[/span][/li] Side: [span class=icon-horde]Horde[/span][/li]
修改后的提取函数
Private Function ExtractSide(sourceCode As String) As String ' 匹配两种格式:直接是Side: 目标值[/li],或Side: <span>目标值</span>[/li] Dim pattern As String = "Side: (?:\[span class=icon-(?:alliance|horde)\])?([A-Za-z]+)\[\/span\]?\[\/li\]" Dim match As Match = Regex.Match(sourceCode, pattern, RegexOptions.IgnoreCase) If match.Success Then Return match.Groups(1).Value Else Return String.Empty End If End Function
关键修改说明
- 修正匹配格式:移除原正则中多余的空格,同时兼容带span标签和不带标签的两种格式
- 精准捕获目标值:用
([A-Za-z]+)直接提取字母组成的目标值,避免捕获span标签内容 - 可选标签匹配:用
?标记span标签部分为可选,同时限定仅匹配icon-alliance和icon-horde两种标签 - 忽略大小写:添加
RegexOptions.IgnoreCase参数,避免因网页源码大小写不一致导致匹配失败
原代码失效原因
- 原正则
Side: (.*?) [/li]多了一个空格,与网页实际格式不匹配 - 非贪婪匹配
.*?会捕获到span标签的冗余内容,无法直接提取目标值
内容的提问来源于stack exchange,提问作者kon kon
相关产品推荐
相关产品推荐

