【问题标题】:How to select non-immediate child elements?如何选择非直接子元素?
【发布时间】:2020-08-23 03:43:35
【问题描述】:

我正在尝试从几行 HTML(this Reddit page)中提取属性的值,对每个元素执行此操作,然后将这些值放入数组中。 (基本上是为了计算 Reddit 帖子的奖励数量。)

代码没有返回任何东西;奖励计数为 0。

目标:检查是否有一个名为“awarding-link”的类,将不同奖励的#相加得到总金额。

我还有一个问题:我需要检查那个“奖励链接”,但没有评论区。所以它们需要是 id "siteTable" 的子元素。问题是我不能只使用另一个“>”,因为那是直接子元素。

Sub GetData2()

Dim IE As InternetExplorer
Dim itemEle As Object, datacountobj As Object, awards As Object
Dim upvote As Integer

Dim postdate As String, upvotepercent As String, awardAdd As String, _
  awardCount As String, animated As String, dates As String, isanimated As String, _
  oc As String, filetype As String, linkurl As String, myhtmldata As String, _
  visiComments As String, totalComments As String, removedComments As String, _
  test As String, tested As String, test2 As String, test3 As String, title As String, _
  deletedComments As String

Dim y As Integer, x As Integer
Dim U As Long, L As Long, j As Long

Set IE = New InternetExplorer
IE.Visible = True

IE.navigate (ActiveCell.Value)
Do While IE.Busy = True Or IE.readyState <> 4: DoEvents: Loop

Dim nodeList As Object, i As Long, urls(), results(), results2()

    Set awards = IE.document.querySelectorAll("span.awardings-bar > awarding-link")
    If Not awards Is Nothing Then
        awardCount = 0
        For x = 0 To awards.Length - 1
            awardAdd = awards.getAttribute("data-count")
            awardCount = awardCount + awardAdd
        Next x
    Else
        awardCount = 0
    End If
    results(i + 1, 14) = awardCount

(结果只是一个基于 0 的一维数组)

【问题讨论】:

  • 在您提供的链接中,我找不到您提供的 awarding-link 特定类的任何类。您确定这是要选择的正确元素吗?因为awardings-bar 是一个空的span。我应该登录查看结果吗?

标签: html css excel vba web-scraping


【解决方案1】:

你的 css 选择器错误,所以没有结果。

切换到更短的

.awarding-link

或使用

span.awardings-bar > .awarding-link

注意奖励链接前面的类选择器.

为避免检索 cmets 并仅限于顶部的奖励部分,请使用限制的父级,例如:

.entry .awarding-link

【讨论】:

  • 谢谢@QHarr!哦,我忘了点。我怎么没注意到。最后一个问题:你知道我如何确保它没有找到评论部分中的元素吗?如,避免属于“commentarea”类的子元素的元素?因为有时 cmets 获得奖励,然后他们具有完全相同的类和父元素,所以他们会被计算在内。我无法弄清楚,因为“commentarea”不是直接父元素,它是几个级别。
  • 很抱歉最后一次打扰您(希望如此),但您知道为什么我的 Awards.getAttribute("data-count") 返回错误 438 -“对象不支持此属性或方法“?奖项是这样设置的。 Set awards = IE.document.querySelectorAll("#siteTable .awarding-link")我可以这样做吗?唯一定义评论区没有的功能是 id "siteTable"。
  • 没关系,我设法做对了!干杯,感谢所有的帮助!
猜你喜欢
  • 2021-09-21
  • 2012-02-17
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多