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


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

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

帅哥哟,离线,有人找我吗?
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | 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")


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

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


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

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

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

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


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

有个特殊字符显示不了,9楼更新了一下

 回到顶部