以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 如何获取网页里表格数据 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=140678) |
||||
-- 作者:zpsun2003 -- 发布时间:2019/9/11 10:48:00 -- 如何获取网页里表格数据 Dim web As New System.Windows.Forms.WebBrowser() web.ScriptErrorsSuppressed = True \'出现脚本错误 web.Navigate("https://www.ccmn.cn/historyprice/cjxh_1/") Do Until web.ReadyState = 4 Application.DoEvents Loop \'取数据 Dim Cols() As String = { "序号","品名","价格区间","均价","涨跌","单位","发布日期" } Dim elems As object = web.Document.GetElementById("list_elem").GetElementsByTagName("tr") Dim m As Integer = 0 For Each elem As object In elems Dim i As Integer = -1 m = m + 1 If m > 1 Then \'因为网页的表格有标题,如果不判断,就会增加出一个空行 Tables("长江现货").AddNew End If Dim tdelems As object = elem.GetElementsByTagName("td") For Each tdelem As object In tdelems i = i + 1 Tables("长江现货").Current(Cols(i)) = tdelem.Innertext Tables("长江现货").Current("录入日期") = Date.Today If i > 2 Then \'必须要当价格区间列已经有值,才能执行以下代码 Dim s As String = Tables("长江现货").Current("价格区间") Dim s2 As String = s.SubString(5,1) \'价格区间中间的横杠有点特殊,不是键盘上的短横杠.所以用Asc()函数和Chr(-24150))配合来引用. Dim k As String = s.IndexOf(Chr(-24150)) \'用Asc(s2)函数获得-的字符编码是-24150 Tables("长江现货").Current("最高价") = s.SubString(k+1) Tables("长江现货").Current("最低价") = s.Remove(k) End If Next Next Tables("长江现货").save 这是从咱们论坛上找到的在长江现货网上自动提取数据的例子,但现在打不开了,应该是:web.Document.GetElementById("list_elem").GetElementsByTagName("tr")里list_elem和tr的名称现在不对了吧,那现在应该是什么呢,从网页上怎么查这个名称,还有后面的elem.GetElementsByTagName("td")里的td 以下是之前的例子,如何再能实现呢?
|
||||
-- 作者:有点蓝 -- 发布时间:2019/9/11 11:02:00 -- 有些网页为了防被抓数据,可能会随时更改标签和样式的。所以过一段时间就用不了很正常。 |
||||
-- 作者:zpsun2003 -- 发布时间:2019/9/11 11:18:00 -- 在执行“web.Navigate("https://www.ccmn.cn/historyprice/cjxh_1/")”这个代码时出现脚本错误,对抓取数据会不会有影响啊 |
||||
-- 作者:有点蓝 -- 发布时间:2019/9/11 11:40:00 -- 这个无法确定,要看脚本是干啥用的。有些网页内容是通过脚本动态生成的,这种肯定有影响的 |
||||
-- 作者:zpsun2003 -- 发布时间:2019/9/11 12:41:00 -- 老师,代码结构找到了,在例子里,能不能给看下例子中的代码应该怎么调整呢? [此贴子已经被作者于2019/9/11 12:52:30编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2019/9/11 13:48:00 -- 自己调试哪个节点是什么内容,应该填入哪个单元格 Dim m As Integer = 0 msgbox(elems.count) For Each elem As object In elems msgbox(elem.Innerhtml) Dim i As Integer = -1 m = m + 1 If m > 1 Then \'因为网页的表格有标题,如果不判断,就会增加出一个空行 Tables("长江现货").AddNew End If Dim tdelems As object = elem.GetElementsByTagName("td") For Each tdelem As object In tdelems msgbox(tdelem.Innertext) i = i + 1 Tables("长江现货").Current(Cols(i)) = tdelem.Innertext …… |
||||
-- 作者:zpsun2003 -- 发布时间:2019/9/11 14:59:00 -- Dim web As New System.Windows.Forms.WebBrowser() web.Navigate("https://www.ccmn.cn/historyprice/cjxh_1/") Do Until web.ReadyState = 4 AndAlso web.Document.GetElementById("Table1") IsNot Nothing Application.DoEvents Loop msgbox("加载完成") Dim elems As object = web.Document.GetElementById("Table1").GetElementsByTagName("tr") msgbox(elems.count) 返回elems.count=0呢?
|
||||
-- 作者:有点蓝 -- 发布时间:2019/9/11 15:15:00 -- 那就说明Table1这个名称的表格里没有tr这种元素的内容 |