我正在尝试从tvdb中分离并处理整个季节的剧集编号。就像一个简单的例子,我正在表演节目LEGION(https://www.thetvdb.com/series/legion)。该主页将显示该节目有多少个季节,并且在该行的结尾处,有一个徽章指示每个季节的插播次数。我想要一个剧集的“绝对数量”,所以我需要将所有这些数量加在一起。我能够做到这一点,但是我想排除“特殊”季的插曲编号,这是很难的部分。尤其是因为这些元素的内部文本会在指示参考季节之前显示徽章值。
我经历了几个阶段。 首先,我能够获取父标签的内部文本,这给了我一段信息,说明了表中的所有内容,如下所示(似乎有2个标签具有相同的类名,这就是为什么我得到双重结果的原因。也将不胜感激)
特价 2018年4月-2018年4月 8
第1季 2017年2月-2017年3月 11
第2季 2018年4月-2018年6月 8
第3季 2019年6月-2019年8月
所有季节
1 特价商品 2018年4月-2018年4月
8 第1季 2017年2月-2017年3月
11 第2季 2018年4月-2018年6月
8 第三季 2019年6月-2019年8月
所有季节
第二,我可以通过如下遍历父标记中的所有元素来一次隔离一个块
1 特价商品 2018年4月-2018年4月
第三步,我可以再次循环浏览并仅隔离徽章中的数字(我说徽章是因为它是html代码中引用的方式)
我还回过头来进行第二阶段的工作,并在其中放置了一个正则表达式函数来识别“ specials”一词,但无法弄清楚如何跳过它并继续在运行中循环。
我相信我可能需要与父母,孩子,兄弟姐妹一起编码以实现我想要的。
预先感谢
Sub()
Dim XML_05 As New MSXML2.XMLHTTP60
Dim HTML_05 As New MSHTML.HTMLDocument
XML_05.Open "GET", "https://www.thetvdb.com/series/legion", False
XML_05.send
HTML_05.body.innerHTML = XML_05.responseText
Dim NETC_05 As MSHTML.IHTMLElementCollection
Dim NET_05 As MSHTML.IHTMLElement
Dim REO_05 As VBScript_RegExp_55.RegExp
Dim MO_05 As Object
Dim SeasonsList As MSHTML.IHTMLElementCollection
Dim SeasonsInfo As MSHTML.IHTMLElement
Dim SI_05 As MSHTML.IHTMLElement
Dim Badge As MSHTML.IHTMLElement
Set SeasonsList = HTML_05.getElementsByClassName("hidden-sm hidden-md hidden-lg")
For Each SeasonsInfo In SeasonsList
Debug.Print SeasonsList.Length
For Each SI_05 In SeasonsInfo.getElementsByTagName("li")
For Each Badge In SI_05.Children
Debug.Print Badge.innerText
Next Badge
Next SI_05
Next SeasonsInfo
End Sub
答案 0 :(得分:0)
Specials
在前,All Seasons
在后,因此您可以将nodeList
从1
循环到nodeList.Length-2
来避免这两个节点,并简单地求和在两者之间。我使用替代HTMLDocument变量来保存每个节点的html,因此我可以再次利用querySelector
并通过getElements
和nextSibling
等避免长链。我不确定您是否想要另一个同时也需要提供相关信息,因此我将每个季节的名称,日期和剧集计数存储在数组results
中(不包括所述节点)。这种方法还意味着代码复杂度降低到单个循环。
Option Explicit
Public Sub GetTotalEpisodes()
Dim i As Long, html As MSHTML.HTMLDocument, html2 As MSHTML.HTMLDocument, seasons As Object, results(), r As Long
Set html = New HTMLDocument: Set html2 = New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.thetvdb.com/series/legion", False
.send
html.body.innerHTML = .responseText
End With
Set seasons = html.querySelectorAll(".hidden-xs .list-group-item")
ReDim results(1 To seasons.Length - 2, 1 To 3)
For i = 1 To seasons.Length - 2
html2.body.innerHTML = seasons.item(i).outerHTML
results(i, 1) = Trim$(html2.querySelector(".list-group-item-heading").innerText)
results(i, 2) = Trim$(html2.querySelector(".list-group-item-text").innerText)
results(i, 3) = 1 * html2.querySelector(".badge").innerText
Next
Debug.Print Application.Sum(Application.index(results, 0, 3))
End Sub
如果您想存储所有信息(包括第一个节点和最后一个节点),但仍执行条件求和,则可以将标题排除在数组之外,并在循环期间进行检查;仅在当前标头不在排除数组中时求和
Option Explicit
Public Sub GetTotalEpisodes()
Dim i As Long, html As MSHTML.HTMLDocument, html2 As MSHTML.HTMLDocument, seasons As Object, results(), r As Long
Dim exclusions(), heading As String, badge As Long, total As Long
Set html = New HTMLDocument: Set html2 = New HTMLDocument
exclusions = Array("Specials", "All Seasons")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.thetvdb.com/series/legion", False
.send
html.body.innerHTML = .responseText
End With
Set seasons = html.querySelectorAll(".hidden-xs .list-group-item")
ReDim results(1 To seasons.Length, 1 To 3)
On Error Resume Next
For i = 0 To seasons.Length - 1
html2.body.innerHTML = seasons.item(i).outerHTML
heading = Trim$(html2.querySelector(".list-group-item-heading").innerText)
badge = 1 * html2.querySelector(".badge").innerText
results(i + 1, 1) = html2.querySelector(".list-group-item-heading").innerText
results(i + 1, 2) = Trim$(html2.querySelector(".list-group-item-text").innerText)
results(i + 1, 3) = badge
If IsError(Application.match(heading, exclusions, 0)) Then
total = total + badge
End If
Next
On Error GoTo 0
Debug.Print total
End Sub
OP问题:
文件中出现Option Explicit On或Option Explicit时,您必须 通过使用Dim或ReDim语句显式声明所有变量。 如果尝试使用未声明的变量名,则会在以下位置发生错误 编译时间。 Option Explicit Off语句允许隐式 声明变量。
这是最佳实践,对于捕捉错别字也很有用。
results()
-我声明的是dynamic array,表示我还不知道所需的尺寸,但稍后会在我需要时进行ReDim。实际上,它是results()As Variant(隐式)。另请参见here。稍后我可以ReDim,因为此时
设置季节= html.querySelectorAll(“。hidden-xs .list-group-item”)
seasons.Length
将为我提供results()
第一维的行数。
getElementsBy
类似。它将css selector(或组合)应用于HTMLDocument(例如ie.Document
)。 Document方法querySelectorAll()返回静态(非实时) NodeList表示与以下元素匹配的文档元素列表 指定的选择器组
现代浏览器针对CSS进行了优化,因此,这通常是一种快速而灵活的查找节点的方法。
Trim$
-是Trim
的输入版本。它用于从node.innerText
中删除多余的开头/结尾空白。
底部版本适用于单个季节。只需更改数组exclusions
即可解决您希望包含/排除的内容。如果没有,请提供一个例子,我会为您更新。