Foxtable(狐表)用户栏目专家坐堂 → 求助:今日头条解析到数据表,结果运行出错,求解!


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

主题:求助:今日头条解析到数据表,结果运行出错,求解!

帅哥哟,离线,有人找我吗?
李孝春
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
求助:今日头条解析到数据表,结果运行出错,求解!  发帖心情 Post By:2016/11/1 10:41:00 [只看该作者]

运行错误如下:

图片点击可在新窗口打开查看此主题相关图片如下:11.png
图片点击可在新窗口打开查看
项目实例如下:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:今日头条.table
按钮代码如下:
Dim web As new System.Windows.Forms.WebBrowser
web.ScriptErrorsSuppressed = True
'web.Navigate("http://toutiao.com/m6114233861/")
Dim ad As WinForm.ComboBox = e.Form.Controls("ComboBox2")
web.Navigate(ad.Value)
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Dim pg = web.Document.GetElementById("pagebar").GetElementsByTagName("a")
Dim mpg As Integer = 1
If pg.count > 1 Then
    mpg = pg(pg.count-2).Innertext
End If
DataTables("文章列表").DataRows.Clear
For i As Integer = 1 To mpg
    web.Navigate( ad.text & "/p" & i)
    'web.Navigate("http://toutiao.com/m6114233861/p" & i)
    Do Until web.ReadyState = 4
        Application.DoEvents
    Loop
    Dim divs = web.Document.GetElementById("ColumnContainer")
    For Each div As object In divs.GetElementsByTagName("div")
        If div.GetAttribute("ClassName") = "pin" Then
            Dim tbs = div.GetElementsByTagName("table")
            Dim trs = tbs(0).GetElementsByTagName("tr")
            'output.show(trs(0).GetElementsByTagName("h3")(0).Innertext) '文章标题
            'output.show(trs(0).GetElementsByTagName("a")(0).GetAttribute("href")) '文章标题
            'output.show(trs(1).GetElementsByTagName("div")(1).Innertext)  '正文
            Dim tds = trs(2).GetElementsByTagName("td")
            'output.show(tds(1).innertext)  '阅读数
            'output.show(tds(2).innertext)  '评论数
            'output.show(tds(3).innertext)  '发布时间
            'output.show("------")
            Dim dr As DataRow = DataTables("文章列表").AddNew()
            Dim 阅读数 As String = tds(1).innertext
            Dim Parts() As String = 阅读数.Split(":")
            Dim 评论数 As String = tds(2).innertext
            Dim Parts1() As String = 评论数.Split(":")
            Dim bt As System.Windows.Forms.HtmlElement
            bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
            'Output.Show(bt.innerText & " " & bt.GetAttribute("content"))
            dr("单位") = bt.innerText & " " & bt.GetAttribute("content")
            'msgbox(bt.innerText & " " & bt.GetAttribute("content"))
            dr("文章标题") = trs(0).GetElementsByTagName("h3")(0).Innertext
            dr("发布时间") = tds(3).innertext
            dr("阅读数") = Parts(1)
            dr("评论数") = Parts1(1)
            dr("正文") = trs(1).GetElementsByTagName("div")(1).Innertext
            dr("网址") = trs(0).GetElementsByTagName("a")(0).GetAttribute("href")
        End If
    Next
Next
[此贴子已经被作者于2016/11/1 10:41:52编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107034 积分:544401 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/1 11:14:00 [只看该作者]

所有使用GetElementById、GetElementsByTagName的地方都判断一下

Dim pg = web.Document.GetElementById("pagebar").GetElementsByTagName("a")
改为
dim e1  = web.Document.GetElementById("pagebar")
if e1 isnot nothing then
dim pg = e1.GetElementsByTagName("a")
if pg.count > 0 then
'其它代码
endif
end if


 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)所有使用GetElementById、GetElement...  发帖心情 Post By:2016/11/1 11:46:00 [只看该作者]

不抱错  但是也没数据 
Dim web As new System.Windows.Forms.WebBrowser
web.ScriptErrorsSuppressed = True
web.Navigate("http://toutiao.com/m6114233861/")

Do Until web.ReadyState = 4
    Application.DoEvents
Loop

Dim e1  = web.Document.GetElementById("pagebar")
If e1 IsNot Nothing Then
    
    Dim pg = e1.GetElementsByTagName("a")
    
    If pg.count > 0 Then
        Dim mpg As Integer = 1
        If pg.count > 1 Then
            mpg = pg(pg.count-2).Innertext
        End If    
        For i As Integer = 1 To mpg
            web.Navigate("http://toutiao.com/m6114233861/p" & i)
            Do Until web.ReadyState = 4
                Application.DoEvents
            Loop
            Dim divs = web.Document.GetElementById("ColumnContainer")
            For Each div As object In divs.GetElementsByTagName("div")
                If div.GetAttribute("ClassName") = "pin" Then
                    Dim tbs = div.GetElementsByTagName("table")
                    Dim trs = tbs(0).GetElementsByTagName("tr")
                    output.show(trs(0).GetElementsByTagName("h3")(0).Innertext) '文章标题
                    output.show(trs(0).GetElementsByTagName("a")(0).GetAttribute("href")) '文章标题
                    output.show(trs(1).GetElementsByTagName("div")(1).Innertext)  '正文
                    Dim tds = trs(2).GetElementsByTagName("td")
                    output.show(tds(1).innertext)  '阅读数
                    output.show(tds(2).innertext)  '评论数
                    output.show(tds(3).innertext)  '发布时间
                    output.show("------")
                   
                End If
            Next
        Next
        
    End If
End If

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107034 积分:544401 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/1 12:07:00 [只看该作者]

说明页面没有对应的标签,请求出错或其他原因返回的不是你想要的页面

自己输出内容分析,
Dim web As new System.Windows.Forms.WebBrowser
web.ScriptErrorsSuppressed = True
web.Navigate("http://toutiao.com/m6114233861/")

Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Output.Show(web.Document.Body.InnerHtml)

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


加好友 发短信
等级:二尾狐 帖子:573 积分:2961 威望:0 精华:0 注册:2016/10/27 14:33:00
  发帖心情 Post By:2016/11/1 12:57:00 [只看该作者]

你这种方法无效了,人家用动态加载了,每次加载10行数据。

 

下面的方法也只能获取到10行。

 

Dim web As new System.Windows.Forms.WebBrowser
web.ScriptErrorsSuppressed = True
web.Navigate("http://toutiao.com/m6114233861/")

Do Until web.ReadyState = 4 AndAlso web.Document.GetElementById("content-left") IsNot Nothing AndAlso web.Document.GetElementById("content-left").GetElementsByTagName("li").count > 0
    Application.DoEvents
Loop
Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
DataTables("文章列表").DataRows.Clear
For i As Integer = 0 To lis.count-1
    Dim lsa = lis(i).GetElementsByTagName("a")
    output.show(lsa(0).InnerHtml)
Next


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


加好友 发短信
等级:二尾狐 帖子:573 积分:2961 威望:0 精华:0 注册:2016/10/27 14:33:00
  发帖心情 Post By:2016/11/1 13:08:00 [只看该作者]

 你可以用手动的方式。放一个webbrowser控件,显示页面,然后滚动到最后(每次加载10行),直到加载完毕,你再用代码获取这个页面的数据。

 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)说明页面没有对应的标签,请求出错或...  发帖心情 Post By:2016/11/1 13:30:00 [只看该作者]

Dim web As new windows.forms.webbrowser
web.Navigate("http://toutiao.com/m6051259851/")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Dim getReader = new System.IO.StreamReader(web.DocumentStream, Encoding.Default)
Dim str = getReader.ReadToEnd()
'output.show(str)

Dim bt As System.Windows.Forms.HtmlElement
bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
Dim bt1 As System.Windows.Forms.HtmlElement
bt1 = web.Document.GetElementByID("description")
Output.Show(bt.innerText & " " & bt.GetAttribute("content"))   ‘输出结果:瓮安县人民检察院
Output.Show(bt1.innerText & " " & bt1.GetAttribute("content")) ‘输出结果: 瓮安县人民检察院头条号,带您了解详尽的行业资讯.瓮安县人民检察院深度分析,专业见解.你关心的,才是头条.阅读瓮安县人民检察院最新文章,就在头条号.

Dim divs = web.Document.GetElementById("media-header")
For Each div As object In divs.GetElementsByTagName("div")
    If div.GetAttribute("Class") = "rbox-inner" Then
        Dim tbs = div.GetElementsByTagName("title-box link")
        Dim trs = tbs(0).GetElementsByTagName("title-box link")
        output.show(tbs(0).GetElementsByTagName("href")(0).Innertext) '
        output.show(trs(1).GetElementsByTagName("abstract")(1).Innertext)  '
        
    End If
Next



下面是输出结果:
 瓮安县人民检察院
 瓮安县人民检察院头条号,带您了解详尽的行业资讯.瓮安县人民检察院深度分析,专业见解.你关心的,才是头条.阅读瓮安县人民检察院最新文章,就在头条号.

更多的文章标题  地址 阅读数  评论数 发布时间  文章简介却操作不出来


 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点青) 你可以用手动的方式。放一个we...  发帖心情 Post By:2016/11/1 13:46:00 [只看该作者]

有没有办法直接获取指定行数的数据呢?
比如每次加载十行  那么我指定每次加载的行数 或者按照之前的页数方式 加载全部页数 加载全部行数来操作呢?


 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点青) 你可以用手动的方式。放一个we...  发帖心情 Post By:2016/11/1 14:01:00 [只看该作者]

参照写,报错如下:
Dim web As new System.Windows.Forms.WebBrowser
web.ScriptErrorsSuppressed = True
web.Navigate("http://toutiao.com/m6051259851/")
Do Until web.ReadyState = 4 AndAlso web.Document.GetElementById("content-left") IsNot Nothing AndAlso web.Document.GetElementById("content-left").GetElementsByTagName("li").count > 0
    Application.DoEvents
Loop
Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
For i As Integer = 0 To lis.count-1
Dim lsa = lis(i).GetElementsByTagName("a")
output.show(lsa(0).InnerHtml)
Dim lsp = lis(i).GetElementsByTagName("p")
output.show(lsp(1).InnerHtml)
Dim lspSPAN = lis(i).GetElementsByTagName("SPAN")
output.show(lspSPAN(2).InnerHtml)
Dim lsphref = lis(i).GetElementsByTagName("href")
output.show(lsphref(0).InnerHtml)
Next

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


 回到顶部
帅哥哟,离线,有人找我吗?
李孝春
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点青)你这种方法无效了,人家用动态加载了...  发帖心情 Post By:2016/11/1 14:11:00 [只看该作者]

如果需要加载A标签下  class="title-box link" 这个的值 怎么代码中加上呢?

Dim web As new System.Windows.Forms.WebBrowser
web.ScriptErrorsSuppressed = True
web.Navigate("http://toutiao.com/m6114233861/")

Do Until web.ReadyState = 4 AndAlso web.Document.GetElementById("content-left") IsNot Nothing AndAlso web.Document.GetElementById("content-left").GetElementsByTagName("li").count > 0
    Application.DoEvents
Loop
Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
DataTables("文章列表").DataRows.Clear
For i As Integer = 0 To lis.count-1
    Dim lsa = lis(i).GetElementsByTagName("a")
    output.show(lsa(0).InnerHtml)
Next


 回到顶部
总数 17 1 2 下一页