我正在编写一个使用 Windows 窗体 WebBrowser 控件从网站上抓取数据的程序。
我已经<tr>
在一个名为row
. 后续代码使用row.FirstChild
返回 null。
当我? row
在 Visual Studio 即时窗口中运行时,输出包括以下看似矛盾的行。(数据已通过将字母替换为“Z”并将数字替换为 0 进行了清理;空格保持不变;已添加换行符以提高可读性)。
Children: {System.Windows.Forms.HtmlElementCollection}
FirstChild: null
InnerHtml: "\n\t\t<td class=\"rgGroupCol\"> </td><td>00000000</td>
<td>ZZZ 000</td><td>Text Remvd I: Zzzzzzzz Zzzzzzzzz</td><td>0</td>
<td>Zzzzzzzzz</td><td>Zz</td>
<td>\n\t\t\t\t\t\t\t00:00 Z 00:00 Z\n\t\t\t\t\t\t</td>
<td>\n\t\t\t\t\t\t\t0/00/0000 to 00/00/0000\n\t\t\t\t\t\t</td>
<td>Zzzzz Zzzzzzzz 000</td><td>Zzzzz Z Zzzzzzz</td>\n\t"
在我看来,由于InnerHtml
字符串明显存在多个标签,FirstChild
因此不应为空。事实上,当我Children
在 Locals 窗口中展开属性时,它Count
是 11,我可以展开结果视图来查看我期望的各个标签。
该网站的所有者最近对其进行了更新,并引入了许多 HTML 和脚本错误;但是,W3C Validator 不会在页面的这一部分报告任何错误,我也没有看到这些标签有任何问题。我确实ScriptErrorsSuppressed = true
设置了我的WebBrowser
对象,并且设置HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\MyProg.vshost.exe
为 10001。
环境细节:
- 带有 Windows Media Center 的 Windows 8 Pro 64 位
- Internet Explorer 10.0.9200.16635
- 在 .NET 4.5 中使用 C# 5.0 中的 System.Windows.Forms.WebBrowser 控件编译为 64 位可执行文件
我在这里想念什么?FirstChild
当明显有孩子在场时,怎么可能为空?如果我没有看到的 HTML 有一些问题,我如何在不更改页面(属于其他人的页面)的情况下解决它?
变通方法
面对正在工作的代码,然后突然停止工作,我非常专注于寻找原因,以至于我完全错过了明显的变通方法。第二天晚上它向我跳了出来,就在这里。我只是替换row.FirstChild
为row.Children[0]
,其余代码未更改并成功运行。当然,这并不能解释我所看到的行为,但它确实让我过去了。