苏飞论坛

标题: c# 的 webbrowser 怎么读取不到 html 的元素? [打印本页]

作者: hyw322    时间: 2014-7-17 11:11
标题: c# 的 webbrowser 怎么读取不到 html 的元素?
本帖最后由 hyw322 于 2014-7-17 11:33 编辑

richTextBoxTest.Text += webBrowser1.Document.GetElementById("kename").GetAttribute("value");

在这句报错,经过测试发现,这样的错误时根本找不到ID为“kename”的元素,但是网页源代码明明是可以看到的。不单是这一个元素,其他好多元素都是这个样。




两种情况:
1.在线登陆到这个页面,就出错了。
2.把网页源代码保存到本地,webbrowser.navigator本地的源代码就不会出错,结果也正确。

请问大侠们,这是怎么回事呢?


不好意思,不会设置,怎么下载还扣钱呢,需要免费资源的大侠留个邮箱。

作者: 站长苏飞    时间: 2014-7-17 12:12
你确定这个对象存在吗,
作者: hyw322    时间: 2014-7-17 13:30
附件的html源文件就是这个网页的代码,通过c#保存下来的。
这是其中kename的片段:
<table class="table_list" align="center"width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
                <th>客户信息:</th>
                <th></th>
        </tr>
        <tbody>
        <tr>
                <td class="table_list_right" width="20%">
                        客户名称:&nbsp;
                </td>
                <td class="table_list_left" width="80%"  id="kename" style="font-size: 12pt;letter-spacing: 1px;font-weight: bold">
                </td>
        </tr>
        <tr>
                <td class="table_list_right" width="20%">
                        相关信息:&nbsp;
                </td>
                <td class="table_list_left" width="80%" id="othertd" style="font-size: 12pt;letter-spacing: 1px;font-weight: bold">
                </td>
        </tr>
    </tbody>
</table>

作者: hyw322    时间: 2014-7-17 13:32
站长苏飞 发表于 2014-7-17 12:12
你确定这个对象存在吗,

                <td class="table_list_left" width="80%"  id="kename" style="font-size: 12pt;letter-spacing: 1px;font-weight: bold">
                </td>

这是其中一点代码,具体请往下看。完整的html源代码在附件。谢谢。
作者: hyw322    时间: 2014-7-17 13:34
站长苏飞 发表于 2014-7-17 12:12
你确定这个对象存在吗,

                <td class="table_list_left" width="80%"  id="kename" style="font-size: 12pt;letter-spacing: 1px;font-weight: bold">
                </td>
这是其中的一点片段,具体往下看。完整的html源文件在附件。谢谢。非常感谢你帮了我的大忙,真的太感谢你啦!
作者: hyw322    时间: 2014-7-17 13:34
站长苏飞 发表于 2014-7-17 12:12
你确定这个对象存在吗,

                <td class="table_list_left" width="80%"  id="kename" style="font-size: 12pt;letter-spacing: 1px;font-weight: bold">
                </td>
这是其中的一点片段,具体往下看。完整的html源文件在附件。谢谢。非常感谢你帮了我的大忙,真的太感谢你啦!
作者: 站长苏飞    时间: 2014-7-17 13:36
document.all然后再获取看看
作者: hyw322    时间: 2014-7-17 13:44
站长苏飞 发表于 2014-7-17 13:36
document.all然后再获取看看

richTextBoxTest.Text += webBrowser1.Document.All.GetElementsByName("");

Document.All只有ByName,没有ById...
作者: 站长苏飞    时间: 2014-7-17 13:49
使用webBrowser1.Document.GetElementById("kename")可以获取啊,这里面说的肯定不是这个错,是没有Value这个属性,这个可以直接。出来的,不需要使用方法获取
作者: hyw322    时间: 2014-7-17 13:55
站长苏飞 发表于 2014-7-17 13:49
使用webBrowser1.Document.GetElementById("kename")可以获取啊,这里面说的肯定不是这个错,是没有Value这 ...

                <td class="table_list_right" width="10%" height="45px">
                        <INPUT class="" style="float:left;font-size: 25pt;font-weight:bold;line-height: 35px;
                                height: 35px;width: 300px;vertical-align: middle;letter-spacing: 2px;border:1px solid #b8cedb;"
                                name="pay.mobileNoForGuest" id="mobileNoForGuest" maxlength="11" onfocus="clsInfo()"
                 onblur="checkValueIsChinaMobile(this,'请输入正确的号码格式!',false);"
                 value=""
                 
            />
            &nbsp;&nbsp;&nbsp;&nbsp;
                         
                </td>


这个“mobileNoForGuest”有value也是一样的报错。
最关键的是,我把源文件保存到本地是可以的,在线登陆就报错。
需要的话我发c#代码给你吧,登陆的账号,密码,短信验证码都可以发给你,帮忙登陆试试。非常感谢你帮了我的大忙,真的太感谢你啦!
作者: 站长苏飞    时间: 2014-7-17 13:57
这里面有并不表示C#里面有,你点个点就明白了,里面有属性的。不要使用方法获取。
作者: 站长苏飞    时间: 2014-7-17 13:58
webBrowser1.Document.GetElementById("控件ID").InnerText;
作者: hyw322    时间: 2014-7-17 14:03
站长苏飞 发表于 2014-7-17 13:58
webBrowser1.Document.GetElementById("控件ID").InnerText;

1.最开始就用的innertext,不行才换的getAttribute,等会我再试试innertext
2.直接打点的话,之有.Id,没有其他属性,并且
  if (webBrowser1.Document.GetElementById("kename").Id == "kename")
  这样也同样报错

作者: 站长苏飞    时间: 2014-7-17 14:07
hyw322 发表于 2014-7-17 14:03
1.最开始就用的innertext,不行才换的getAttribute,等会我再试试innertext
2.直接打点的话,之有.Id, ...

kename是个TD,怎么可能会有Value呢?就是innertext如果不对只有一种情况,你用的不是这个页面的源码,或者是不是Webbroser控件。你看你截图上打的控件名字就不对
作者: hyw322    时间: 2014-7-17 14:12
站长苏飞 发表于 2014-7-17 14:07
kename是个TD,怎么可能会有Value呢?就是innertext如果不对只有一种情况,你用的不是这个页面的源码,或 ...

                <td class="table_list_right" width="10%" height="45px">
                        <INPUT class="" style="float:left;font-size: 25pt;font-weight:bold;line-height: 35px;
                                height: 35px;width: 300px;vertical-align: middle;letter-spacing: 2px;border:1px solid #b8cedb;"
                                name="pay.mobileNoForGuest" id="mobileNoForGuest" maxlength="11" onfocus="clsInfo()"
                 onblur="checkValueIsChinaMobile(this,'请输入正确的号码格式!',false);"
                 value=""
                 
            />
            &nbsp;&nbsp;&nbsp;&nbsp;
                        
                </td>

这是图片显示的那个元素的代码,和“kename”是在同一个页面的。
我用InnerText试试kename受教了,学习中……
作者: hyw322    时间: 2014-7-17 14:32
站长苏飞 发表于 2014-7-17 13:58
webBrowser1.Document.GetElementById("控件ID").InnerText;

保存在本地的html源文件:
webBrowser1.Document.GetElementById("mobileNoForGuest").GetAttribute("value");
这句功能是对的,上网操作就报错,这才是最诡异的,请问怎么破?膜拜中……
作者: hyw322    时间: 2014-7-17 15:30
站长苏飞 发表于 2014-7-17 13:58
webBrowser1.Document.GetElementById("控件ID").InnerText;

InnerText也不行。
把网页保存在本地操作没问题的话,我想代码自身是问题不大的。。。
关键是为什么上网登录后不行,上网登录操作的是webBrowser1.Document,保存网页用的是webBrowser1.DocumentText,这两者之间有区别吗?会是编码的问题吗?
作者: 站长苏飞    时间: 2014-7-17 15:41
这种情况,我估计有两种可能,第一是加载的时候页面内容并没有在上面显示,只有保存时才有,你可以使用Httphelper获取一下看看是不是有这些东西。如果有就说明没事,如果没有说明有问题。

还有一种情况,就是JS修改值了,在运行时JS限制。
作者: hyw322    时间: 2014-7-17 16:43
站长苏飞 发表于 2014-7-17 15:41
这种情况,我估计有两种可能,第一是加载的时候页面内容并没有在上面显示,只有保存时才有,你可以使用Http ...

                HttpItem item = new HttpItem()
                {
                    URL = "http://www.baidu.com/",
                    Method = "get"
                };

                HttpHelper http = new HttpHelper();
                HttpResult result = http.GetHtml(item);

                StreamWriter sw = new StreamWriter(@"D:\0.txt");
                sw.Write(result.Html);
                sw.Close();

是这个意思吗?打开保存的文件后,有点乱:
(先在百度首页试了一下,如果是保存这样的文件的话,我再登录kename那个首页保存一下看看)

<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><link rel="dns-prefetch" href="//s1.bdstatic.com"/><link rel="dns-prefetch" href="//t1.baidu.com"/><link rel="dns-prefetch" href="//t2.baidu.com"/><link rel="dns-prefetch" href="//t3.baidu.com"/><link rel="dns-prefetch" href="//t10.baidu.com"/><link rel="dns-prefetch" href="//t11.baidu.com"/><link rel="dns-prefetch" href="//t12.baidu.com"/><title>百度一下,你就知道</title><style index="index" >html,body{height:100%}html{overflow-y:auto}#wrapper{position:relative;_position:;min-height:100%}#content{padding-bottom:100px;text-align:center}#ftCon




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4