如何用HtmlAgilityPack判断Div内结构 适配VB.NET价格解析逻辑
解决VB.NET桌面应用中动态判断价格结构并解析的方案
我之前也碰到过类似的页面结构变动问题,给你分享个我在VB.NET里用的落地思路,应该能完美匹配你的需求:
核心逻辑
先定位到存放价格的主Div,再检查它内部的嵌套结构——如果包含Table就走Table解析逻辑,否则走普通Div解析逻辑,按需调用对应代码即可。下面是具体实现步骤:
1. 先获取主Div元素
假设你用的是HtmlAgilityPack(VB.NET爬虫最常用的HTML解析库,没装的话直接NuGet搜一下就能装),先定位到价格所在的主容器:
' 替换成你实际的主Div标识,比如class或id Dim doc As New HtmlDocument() doc.LoadHtml(爬取到的网页HTML内容) Dim mainPriceDiv As HtmlNode = doc.DocumentNode.SelectSingleNode("//div[@class='price-main-container']") If mainPriceDiv Is Nothing Then ' 处理主Div不存在的异常情况,比如打日志或提示用户 Return Nothing End If
2. 判断嵌套结构类型
接下来检查主Div内部是否包含Table元素,以此区分两种结构:
' 检查主Div下是否有嵌套的Table Dim priceTable As HtmlNode = mainPriceDiv.SelectSingleNode(".//table") If priceTable IsNot Nothing Then ' 调用Table结构的价格解析方法 Dim realPrice As String = ParsePriceFromTable(priceTable) Return realPrice Else ' 调用普通Div结构的价格解析方法 Dim realPrice As String = ParsePriceFromDiv(mainPriceDiv) Return realPrice End If
3. 实现两种解析方法
Table结构解析示例
假设价格存放在Table的某个指定td里,比如带price-value类的节点:
Private Function ParsePriceFromTable(tableNode As HtmlNode) As String ' 根据实际网页结构调整XPath或选择器 Dim priceNode As HtmlNode = tableNode.SelectSingleNode(".//td[@class='price-value']") If priceNode IsNot Nothing Then ' 清理文本,去掉多余空格、货币符号等 Return priceNode.InnerText.Trim().Replace("¥", "") End If Return Nothing End Function
普通Div结构解析示例
假设价格直接在主Div的子Div节点中,比如带price-text类的节点:
Private Function ParsePriceFromDiv(divNode As HtmlNode) As String ' 根据实际网页结构调整XPath或选择器 Dim priceNode As HtmlNode = divNode.SelectSingleNode(".//div[@class='price-text']") If priceNode IsNot Nothing Then Return priceNode.InnerText.Trim().Replace("¥", "") End If Return Nothing End Function
额外小提示
- 不确定元素路径的话,直接用浏览器F12开发者工具定位元素,复制对应的XPath或选择器就行,省得自己写出错。
- 如果网页是动态加载的(比如价格是JS渲染的),直接爬HTML可能拿不到内容,这时候可以用
WebBrowser控件或者Selenium模拟浏览器渲染后再获取页面源码。 - 记得给解析逻辑加异常处理,比如节点为空的情况,避免因为网页小改动导致程序崩溃。
内容的提问来源于stack exchange,提问作者EL34
相关产品推荐
相关产品推荐

