Foxtable(狐表)用户栏目专家坐堂 → 请教版主获取网页数据项目的问题


  共有2383人关注过本帖树形打印复制链接

主题:请教版主获取网页数据项目的问题

帅哥哟,离线,有人找我吗?
有点色
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/11 12:59:00 [只看该作者]

 谁叫你写在datacolchanged事件。

 

 你直接在3楼的代码,查询表格数据,就行啊。


 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:682 积分:4871 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2017/1/11 13:34:00 [只看该作者]

实在不会了,获取网页数据的这段代码基本看不懂,请版主直接给例子吧。

 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/11 14:14:00 [只看该作者]

Dim web As New System.Windows.Forms.WebBrowser()
web.ScriptErrorsSuppressed = True
web.Navigate("http://youjia.chemcp.com/YuanYouJiaGe.asp")

Do Until web.ReadyState = 4
    Application.DoEvents
Loop

Dim Cols() As String = { "名称","价格","涨跌额","涨跌幅","发布日期" }

Dim elems As object = web.Document.GetElementsByTagName("table")(5).GetElementsByTagName("tr")
Dim t As Table = Tables("国际市场原油价格表")

For i As Integer = 1 To elems.count-1
    Dim tdelems As object =  elems(i).GetElementsByTagName("td")
    Dim fdr As DataRow = t.DataTable.Find("名称 = '" & tdelems(0).Innertext & "' and 发布日期 = #" & tdelems(4).Innertext & "#")
    If fdr Is Nothing Then
        fdr = t.DataTable.AddNew
    End If
    For j As Integer = 0 To Cols.length-1
        If t.Cols(j).IsNumeric Then
            fdr(Cols(j)) = val(tdelems(j).Innertext.replace("↓", "").replace("↑", "").replace("%", ""))
            fdr("录入日期") = Date.Today
        Else
            fdr(Cols(j)) = tdelems(j).Innertext
            fdr("录入日期") = Date.Today
        End If
    Next
Next
t.save


 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:682 积分:4871 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2017/1/11 14:20:00 [只看该作者]

多谢版主!

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:682 积分:4871 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2017/1/17 17:05:00 [只看该作者]

版主,我调整了一下我的表格的列的顺序,

以前应该是"名称","价格","涨跌额","涨跌幅","发布日期",现在把“发布日期”放在第一列了,错误提示如下

 

.NET Framework 版本:2.0.50727.8745
Foxtable 版本:2016.7.29.1
错误所在事件:窗口,国际市场原油价格窗口,Button1,Click
详细错误信息:
从类型“Double”到类型“Date”的转换无效。

 


图片点击可在新窗口打开查看此主题相关图片如下:表结构.png
图片点击可在新窗口打开查看

 

代码如下,红色部分好像有问题,弹出错误提示在4之后。


Dim web As New System.Windows.Forms.WebBrowser()
web.ScriptErrorsSuppressed = True
web.Navigate("http://youjia.chemcp.com/YuanYouJiaGe.asp")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Dim Cols() As String = { "名称","价格","涨跌额","涨跌幅", "发布日期" }
Dim ts = web.Document.GetElementsByTagName("table")
If ts.count <= 5 Then
    MessageBox.show("网络连接失败,请检查网络设置!")
Else
    Dim elems As object = web.Document.GetElementsByTagName("table")(5).GetElementsByTagName("tr")
    Dim t As Table = Tables("国际市场原油价格表")
    For i As Integer = 1 To elems.count-1
        Dim tdelems As object =  elems(i).GetElementsByTagName("td")
MessageBox.show("1")
        Dim fdr As DataRow = t.DataTable.Find("名称 = '" & tdelems(0).Innertext & "' and 发布日期 = #" & tdelems(4).Innertext & "#")
MessageBox.show("2")
        If fdr Is Nothing Then
            fdr = t.DataTable.AddNew
MessageBox.show("3")
        End If
        For j As Integer = 0 To Cols.length-1
            If t.Cols(j).IsNumeric Then
MessageBox.show("4")
                fdr(Cols(j)) = val(tdelems(j).Innertext.replace("↓", "").replace("↑", "").replace("%", ""))
MessageBox.show("5")
            Else
MessageBox.show("6")
                fdr(Cols(j)) = tdelems(j).Innertext
            End If
        Next
        fdr("更新时间") = Date.Now
MessageBox.show("7")
    Next
    t.save
    Tables("国际市场原油价格表").Sort = "发布日期 DESC"
    MessageBox.show("数据更新完毕!")
End If


 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/17 17:49:00 [只看该作者]

 调整列位置不影响数据位置,但你这句代码要改一下

 

If t.Cols(Cols(j)).IsNumeric Then

[此贴子已经被作者于2017/1/18 9:48:21编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:682 积分:4871 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2017/1/17 18:42:00 [只看该作者]

修改为:Dim Cols() As String = { "发布日期" ,"名称","价格","涨跌额","涨跌幅" }

也有如下错误:

 

.NET Framework 版本:2.0.50727.5420
Foxtable 版本:2016.6.26.1
错误所在事件:窗口,窗口1,Button1,Click
详细错误信息:

从字符串“布伦特”到类型“Date”的转换无效。

 

项目文件如下:

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:油价自动获取.table


 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:682 积分:4871 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2017/1/17 19:32:00 [只看该作者]

删除数据录入的循环,逐一制定表格要填充的网页对应的列,问题解决了。
代码如下:
Dim web As New System.Windows.Forms.WebBrowser()
web.ScriptErrorsSuppressed = True
web.Navigate("http://youjia.chemcp.com/YuanYouJiaGe.asp")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Dim Cols() As String = { "发布日期" ,"名称","价格","涨跌额","涨跌幅" }
Dim ts = web.Document.GetElementsByTagName("table")
If ts.count <= 5 Then
    MessageBox.show("网络连接失败,请检查网络设置!")
Else
    Dim elems As object = web.Document.GetElementsByTagName("table")(5).GetElementsByTagName("tr")
    Dim t As Table = Tables("国际市场原油价格表")
    For i As Integer = 1 To elems.count-1
        Dim tdelems As object =  elems(i).GetElementsByTagName("td")
        Dim fdr As DataRow = t.DataTable.Find("名称 = '" & tdelems(0).Innertext & "' and 发布日期 = #" & tdelems(4).Innertext & "#")
        If fdr Is Nothing Then
            fdr = t.DataTable.AddNew
        End If
        fdr("发布日期") = tdelems(4).Innertext
        fdr("名称") = tdelems(0).Innertext
        fdr("价格") = tdelems(1).Innertext
        fdr("涨跌额") = val(tdelems(2).Innertext.replace("↓", "").replace("↑", "").replace("%", ""))
        fdr("涨跌幅") = val(tdelems(3).Innertext.replace("↓", "").replace("↑", "").replace("%", ""))
        fdr("更新时间") = Date.Now
    Next
    t.save
    Tables("国际市场原油价格表").Sort = "发布日期 DESC"
    MessageBox.show("数据更新完毕!")
End If

 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/18 9:48:00 [只看该作者]

哦,错了,改一下代码即可

 

Dim web As New System.Windows.Forms.WebBrowser()
web.ScriptErrorsSuppressed = True
web.Navigate("http://youjia.chemcp.com/YuanYouJiaGe.asp")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Dim Cols() As String = {"名称","价格","涨跌额","涨跌幅","发布日期" }
Dim ts = web.Document.GetElementsByTagName("table")
If ts.count <= 5 Then
    MessageBox.show("网络连接失败,请检查网络设置!")
Else
    Dim elems As object = web.Document.GetElementsByTagName("table")(5).GetElementsByTagName("tr")
    Dim t As Table = Tables("国际市场原油价格表")
    For i As Integer = 1 To elems.count-1
        Dim tdelems As object =  elems(i).GetElementsByTagName("td")
        Dim fdr As DataRow = t.DataTable.Find("名称 = '" & tdelems(0).Innertext & "' and 发布日期 = #" & tdelems(4).Innertext & "#")
        If fdr Is Nothing Then
            fdr = t.DataTable.AddNew
        End If
        For j As Integer = 0 To Cols.length-1
            If t.Cols(Cols(j)).IsNumeric Then
                fdr(Cols(j)) = val(tdelems(j).Innertext.replace("↓", "").replace("↑", "").replace("%", ""))
            Else
                fdr(Cols(j)) = tdelems(j).Innertext
            End If
        Next
        fdr("更新时间") = Date.Now
    Next
    t.save
    Tables("国际市场原油价格表").Sort = "发布日期 DESC"
End If


 回到顶部
帅哥哟,离线,有人找我吗?
天若千颖
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:682 积分:4871 威望:0 精华:0 注册:2014/6/15 16:01:00
  发帖心情 Post By:2017/1/18 10:00:00 [只看该作者]

Cols(Cols(j))  和 Cols(j) 有什么不同?

For j As Integer = 0 To Cols.length-1
            If t.Cols(Cols(j)).IsNumeric Then
                fdr(Cols(j)) = val(tdelems(j).Innertext.replace("↓", "").replace("↑", "").replace("%", ""))
            Else
                fdr(Cols(j)) = tdelems(j).Innertext
            End If
        Next

当j=0的时候,cols(0) 为“发布日期” 非数字列 
 
执行: fdr(Cols(j)) = tdelems(j).Innertext 而 tdelems(0).Innertext 为名称列  
这个也有错误吧,相当于把字符列存入时间列中。

我的修改好像也没有问题。

 回到顶部
总数 22 上一页 1 2 3 下一页