Foxtable(狐表)用户栏目专家坐堂 → 求助: lsspan(0).InnerHtml这个位置有两个不同的值,阅读数与播放数,怎么写代码让这个位置的值,对应分别都识别为阅读数与播放数呢?


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

主题:求助: lsspan(0).InnerHtml这个位置有两个不同的值,阅读数与播放数,怎么写代码让这个位置的值,对应分别都识别为阅读数与播放数呢?

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


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
求助: lsspan(0).InnerHtml这个位置有两个不同的值,阅读数与播放数,怎么写代码让这个位置的值,对应分别都识别为阅读数与播放数呢?  发帖心情 Post By:2016/11/7 15:02:00 [只看该作者]

求助: lsspan(0).InnerHtml这个位置有两个不同的值,阅读数与播放数,怎么写代码让这个位置的值,对应分别都识别为阅读数与播放数呢?
如果是阅读数,就将该值的数据写入阅读数列
如果是播放数,就将该值的数据写入播放数列
 lsspan(1).InnerHtml   lsspan(2).InnerHtml的值及位置不变化。


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


Dim 阅读数 As String = lsspan(0).InnerHtml
Dim Parts() As String = 阅读数.Split("阅读 or 播放")
这样写对不对?

【下面代码红色部分怎么更改呢?怎么判断呢?】

            Dim lsspan = lis(i).GetElementsByTagName("span")
            str &= lsspan(0).InnerHtml & " " & lsspan(1).InnerHtml & " " & lsspan(2).InnerHtml & vbcrlf & vbcrlf
            Dim 阅读数 As String = lsspan(0).InnerHtml
            Dim Parts() As String = 阅读数.Split("阅读")
            Dim 播放数 As String = lsspan(0).InnerHtml
            Dim Parts2() As String = 播放数.Split("播放")
            Dim 评论数 As String = lsspan(1).InnerHtml
            Dim Parts1() As String = 评论数.Split("评论")
            Dim bt As System.Windows.Forms.HtmlElement
            bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
            
            str &= Parts(0) & vbcrlf
            str &= Parts1(0) & vbcrlf
            Dim abc As String= lsspan(2).InnerHtml
            Dim Parts2() As String = abc.Split(" ")
            str &= Parts2(0) & vbcrlf
            
            'Output.Show(bt.innerText & " " & bt.GetAttribute("content"))
            dr("单位") = bt.innerText & " " & bt.GetAttribute("content")
            'msgbox(bt.innerText & " " & bt.GetAttribute("content"))
            dr("文章标题") = a.InnerHtml
            dr("发布时间") =  Parts2(0) & vbcrlf
            dr("阅读数") = Parts(0)
            dr("评论数") = Parts1(0)
            'Dim lsa1 = lis(i).GetElementsByTagName("p")
            'For Each p As object In lsa1
            'If p.GetAttribute("className") = "abstract" Then
            'dr("正文") = p.InnerHtml
            'End If
            'Next
            
            dr("网址") = a.GetAttribute("href")
        End If
    Next
Next
output.Show(str)


[此贴子已经被作者于2016/11/7 16:59:43编辑过]

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


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

 呃,这个是基础问题

 

If lsspan(0).InnerHtml.contains("阅读") Then

 

Else If lsspan(0).InnerHtml.contains("播放") Then

 

End If


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


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点色)?呃,这个是基础问题?...  发帖心情 Post By:2016/11/7 20:46:00 [只看该作者]

按照代码完善,出现下面两种错误 都不是想达到的效果  求解啊!
文章  网址  阅读数  评论数  发布时间  都要能够完整显示出来
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:今日头条测试.foxdb


运行效果1:

图片点击可在新窗口打开查看此主题相关图片如下:00.png
图片点击可在新窗口打开查看
代码如下:
DataTables("头条文章").DataRows.Clear
Dim web As new System.Windows.Forms.WebBrowser
web.Navigate("http://toutiao.com/m6192786832/")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Do Until web.DocumentText.contains("没有更多啦")
    web.Document.Window.ScrollTo(0, 0)
    web.Document.Window.ScrollTo(0, web.Document.Body.ScrollRectangle.Height)
    Application.DoEvents
Loop
Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
Dim str As String = ""
For i As Integer = 0 To lis.count-1
    Dim lsa = lis(i).GetElementsByTagName("a")
    For Each a As object In lsa
        Dim dr As DataRow = DataTables("头条文章").AddNew()
        If a.GetAttribute("className") = "title-box link" Then
            
            str &= a.InnerHtml & vbcrlf
            str &= a.GetAttribute("href") & vbcrlf
            dr("网址") = a.GetAttribute("href")
            Dim bt As System.Windows.Forms.HtmlElement
            bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
            dr("单位") = bt.innerText & " " & bt.GetAttribute("content")
            dr("文章标题") = a.InnerHtml
            
        Else
            If a.GetAttribute("className") = "y-left" Then
                Dim lsspan = lis(i).GetElementsByTagName("span")
                If lsspan(0).InnerHtml.contains("阅读") Then
                    str &= lsspan(0).InnerHtml & " " & lsspan(1).InnerHtml & " " & lsspan(2).InnerHtml & vbcrlf & vbcrlf
                    Dim 阅读数 As String = lsspan(0).InnerHtml
                    Dim Parts() As String = 阅读数.Split("阅读")
                    dr("阅读数") = Parts(0)
                    Dim 评论数 As String = lsspan(1).InnerHtml
                    Dim Parts1() As String = 评论数.Split("评论")
                    dr("评论数") = Parts1(0)
                    dr("发布时间") =  lsspan(2).InnerHtml               '
                Else
                    If lsspan(0).InnerHtml.contains("播放") Then
                        str &= lsspan(0).InnerHtml & " " & lsspan(1).InnerHtml & " " & lsspan(2).InnerHtml & vbcrlf & vbcrlf
                        Dim 阅读数 As String = lsspan(0).InnerHtml
                        Dim Parts2() As String = 阅读数.Split("播放")
                        dr("阅读数") = Parts2(0)
                        output.Show(Parts2(0))
                        Dim 评论数 As String = lsspan(1).InnerHtml
                        Dim Parts1() As String = 评论数.Split("评论")'
                        dr("评论数") = Parts1(0)
                        dr("发布时间") =  lsspan(2).InnerHtml
                    End If
                End If
            End If
        End If
    Next
Next
output.Show(str)




运行效果2:

图片点击可在新窗口打开查看此主题相关图片如下:0.png
图片点击可在新窗口打开查看
运行代码2:
DataTables("头条文章").DataRows.Clear
Dim web As new System.Windows.Forms.WebBrowser
web.Navigate("http://toutiao.com/m6192786832/")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Do Until web.DocumentText.contains("没有更多啦")
    web.Document.Window.ScrollTo(0, 0)
    web.Document.Window.ScrollTo(0, web.Document.Body.ScrollRectangle.Height)
    Application.DoEvents
Loop
Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
Dim str As String = ""
For i As Integer = 0 To lis.count-1
    Dim lsa = lis(i).GetElementsByTagName("a")
    For Each a As object In lsa
        If a.GetAttribute("className") = "title-box link" Then
            Dim dr As DataRow = DataTables("头条文章").AddNew()
            str &= a.InnerHtml & vbcrlf
            str &= a.GetAttribute("href") & vbcrlf
            If a.GetAttribute("className") = "y-left" Then
                Dim lsspan = lis(i).GetElementsByTagName("span")
                If lsspan(0).InnerHtml.contains("阅读") Then
                    str &= lsspan(0).InnerHtml & " " & lsspan(1).InnerHtml & " " & lsspan(2).InnerHtml & vbcrlf & vbcrlf
                    Dim 阅读数 As String = lsspan(0).InnerHtml
                    Dim Parts() As String = 阅读数.Split("阅读")
                    dr("阅读数") = Parts(0)
                    MessageBox.Show(Parts(0))
                    Dim 评论数 As String = lsspan(1).InnerHtml
                    Dim Parts1() As String = 评论数.Split("评论")
                    Dim bt As System.Windows.Forms.HtmlElement
                    bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
                    dr("单位") = bt.innerText & " " & bt.GetAttribute("content")
                    dr("文章标题") = a.InnerHtml
                    dr("发布时间") =  lsspan(2).InnerHtml
                    dr("评论数") = Parts1(0)               '
                    dr("网址") = a.GetAttribute("href")
                Else
                    If lsspan(0).InnerHtml.contains("播放") Then
                        str &= lsspan(0).InnerHtml & " " & lsspan(1).InnerHtml & " " & lsspan(2).InnerHtml & vbcrlf & vbcrlf
                        Dim 阅读数 As String = lsspan(0).InnerHtml
                        Dim Parts2() As String = 阅读数.Split("播放")
                        dr("阅读数") = Parts2(0)
                        MessageBox.Show(Parts2(0))
                        Dim 评论数 As String = lsspan(1).InnerHtml
                        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("文章标题") = a.InnerHtml
                        dr("发布时间") =  lsspan(2).InnerHtml
                        
                        dr("评论数") = Parts1(0)
                        'Dim lsa1 = lis(i).GetElementsByTagName("p")
                        'For Each p As object In lsa1
                        'If p.GetAttribute("className") = "abstract" Then
                        'dr("正文") = p.InnerHtml
                        'End If
                        'Next
                        '
                        dr("网址") = a.GetAttribute("href")
                    End If
                End If
            End If
        End If
    Next
Next
output.Show(str)
[此贴子已经被作者于2016/11/7 20:55:54编辑过]

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


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

第一步,输出网页内容进行分析

DataTables("头条文章").DataRows.Clear
Dim web As new System.Windows.Forms.WebBrowser
web.Navigate("http://toutiao.com/m6192786832/")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Do Until web.DocumentText.contains("没有更多啦")
    web.Document.Window.ScrollTo(0, 0)
    web.Document.Window.ScrollTo(0, web.Document.Body.ScrollRectangle.Height)
    Application.DoEvents
Loop
Output.Show(web.Document.body.Innerhtml)

可以把输出结果放到一些html编辑器中格式化方便分析,我使用的是vs的自动格式化功能,如图

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

[此贴子已经被作者于2016/12/7 10:11:00编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)第一步,输出网页内容就行分析DataTa...  发帖心情 Post By:2016/11/7 21:57:00 [只看该作者]

嗯  我是直接使用chrome浏览器的开发者工具 
第二步呢?

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


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


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


第二部步,分析网页。结合原网页从4楼图中可以看出,每一个li对应一条新闻,所以代码增加行只需要在循环获取li标签的内容时增加即可,而不是在循环a标签中增加行,代码如

Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
Dim str As String = ""
For i As Integer = 0 To lis.count-1
    Dim dr As DataRow = DataTables("头条文章").AddNew()
    Dim lsa = lis(i).GetElementsByTagName("a")


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


加好友 发短信
等级:九尾狐 帖子:2472 积分:17346 威望:0 精华:0 注册:2013/1/31 0:03:00
回复:(有点蓝)[upload=png,1.png]UploadFile/2016-...  发帖心情 Post By:2016/11/7 22:15:00 [只看该作者]

嗯  遍历到了LI下面的元素之后怎么判断“阅读”与“播放”呢?
span会在视频图文下 有四个值  在图文下 有三个值

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

图片点击可在新窗口打开查看此主题相关图片如下:11111.png
图片点击可在新窗口打开查看
初步判断以这个为准进行检索数据
class="y-left"
但是结果没有达到理想

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


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

第三步,从6楼图片结合4楼网页源代码可以看出,有图片的新闻a标签不止一个,有几个图片就多出几个a标签,标题就在第一个a标签里,所以只要获取第一个a标签即可,为了保险起见,观察标题的标签都是以css类“title-box link”设置的,所以就从这个类名称取值安全一点

代码如下

    Dim lsa = lis(i).GetElementsByTagName("a")
    For Each a As object In lsa
        If a.GetAttribute("className") = "title-box link" Then
            str &= a.InnerHtml & vbcrlf
            str &= a.GetAttribute("href") & vbcrlf
            dr("网址") = a.GetAttribute("href")
            Dim bt As System.Windows.Forms.HtmlElement
            bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
            dr("单位") = bt.innerText & " " & bt.GetAttribute("content")
            dr("文章标题") = a.InnerHtml
            Exit For
        End If
    Next

同理,分析阅读量位于class名称为“y-left”的DIV标签里,把网页字符去掉,并分割,可以取出阅读/评论和时间3块内容,代码如下:
    Dim divs = lis(i).GetElementsByTagName("div")
    For Each div As object In divs
        If div.GetAttribute("className") = "y-left" Then
            Dim arr() As String = div.InnerText.Replace(" ","").split("?")
            Dim lsspan As String = arr(0)
                dr("阅读数") = lsspan.Replace("阅读","").Replace("播放","")
                dr("评论数") = arr(1).Replace("评论","")
                dr("发布时间") =  arr(2)    
            Exit For          '
        End If
    Next


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


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

完整代码看:

''' ‘注意这里的三个单引号
DataTables("头条文章").DataRows.Clear
Dim web As new System.Windows.Forms.WebBrowser
web.Navigate("http://toutiao.com/m6192786832/")
Do Until web.ReadyState = 4
    Application.DoEvents
Loop
Do Until web.DocumentText.contains("没有更多啦")
    web.Document.Window.ScrollTo(0, 0)
    web.Document.Window.ScrollTo(0, web.Document.Body.ScrollRectangle.Height)
    Application.DoEvents
Loop

Dim lis = web.Document.GetElementById("content-left").GetElementsByTagName("li")
Dim str As String = ""

For i As Integer = 0 To lis.count-1
    Dim dr As DataRow = DataTables("头条文章").AddNew()
    Dim lsa = lis(i).GetElementsByTagName("a")
    For Each a As object In lsa
        If a.GetAttribute("className") = "title-box link" Then
            str &= a.InnerHtml & vbcrlf
            str &= a.GetAttribute("href") & vbcrlf
            dr("网址") = a.GetAttribute("href")
            Dim bt As System.Windows.Forms.HtmlElement
            bt = web.Document.GetElementByID("keywords")   '今日头条单位标题
            dr("单位") = bt.innerText & " " & bt.GetAttribute("content")
            dr("文章标题") = a.InnerHtml
            Exit For
        End If
    Next
    Dim divs = lis(i).GetElementsByTagName("div")
    For Each div As object In divs
        If div.GetAttribute("className") = "y-left" Then
            Dim arr() As String = div.InnerText.Replace(" ","").split("?") ’论坛无法显示这种特殊符号,所以显示成?号了,到网页源码中拷贝这个特殊符号(见下图)到代码编辑器中即可
            Dim lsspan As String = arr(0)
                dr("阅读数") = lsspan.Replace("阅读","").Replace("播放","")
                dr("评论数") = arr(1).Replace("评论","")
                dr("发布时间") =  arr(2)    
            Exit For          '
        End If
    Next
    
Next


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

[此贴子已经被作者于2016/11/7 22:55:12编辑过]

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


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

一定的编程基础知识+网页基础+一定的耐心分析,代码其实并不复杂。

以后类似的网页分析未必会再给你处理,请自己理解

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