从HTML源中提取价值

我有一个宏,用来去一个网站从A列中提取一个值,例如517167000,从代码的一个特定部分,并将该值返回到一个单元格中.html源现在已经改变,我似乎不能让它工作。

我原来的代码是

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    UnitPerBox = Trim(Split(Split(.responseText, "Units per box</td>")(1), "<tr")(0))
End With

End Function

所以网站的工作实例是

https:/larsonjuhl.co.umouldingslarson-juhl-essentialsarq-essentials-moulding-517167000。

新的html代码看起来像下面的,但它已经很久了,因为我做了原来的宏,所以我认为我可以改变。

"Units per box</td>")(1), "<tr" 

"Units per pack</td> <td class="value">")(1), "<tr"

因为下面的新的html代码是现在的网站上,我需要的值2.74为例,但它不工作。

<tr>
                <td class="name">Units per pack</td>
                <td class="value">2.74</td>
            </tr>

任何帮助将是非常感激的。

一个例子的干杯

解决方案:

如果你去和 .responseText 使用 Split() 在进行文本操作时,你可以使用正则表达式,而不设置它的 Global 参数。

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")

Dim RegEx As Object
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Pattern = "\d+(?:\.\d+)?"

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    UnitPerBox = RegEx.Execute(Split(.responsetext, "Units per pack</td>")(1))(0)
End With

End Function

然而,更整洁的(海事组织)是避免对文本进行操作。.responseText 全盘托出 HTML 文档中,通过元素ID和表格索引从HTML-表中提取适当的数据。

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")
Dim htmlResponse As Object: Set htmlResponse = CreateObject("htmlfile")

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    htmlResponse.body.innerHTML = .responseText
    UnitPerBox = htmlResponse.body.document.getElementById("specifications").getElementsByTagName("tr")(10).getElementsByTagName("td")(1).innerText
End With

End Function

请注意,这个表是0索引的,这意味着我们实际上是从第11行,第二列中检索我们的值。如果你不确定tablecontent总是在相同的索引上找到,你也可以直接循环子节点。

Public Function UnitPerBox(searchTerm As String) As String
Static request As Object
If request Is Nothing Then Set request = CreateObject("msxml2.xmlhttp")
Dim htmlResponse As Object: Set htmlResponse = CreateObject("htmlfile")
Dim Rws As Object

With request
    .Open "GET", "https://larsonjuhl.co.uk/mouldings/larson-juhl-essentials/arq-essentials-moulding-" & searchTerm, False
    .send
    htmlResponse.body.innerHTML = .responseText
    Set Rws = htmlResponse.body.document.getElementById("specifications").getElementsByTagName("tr")
    For Each Rw In Rws
        If Rw.getElementsByTagName("td")(0).InnerText = "Units per pack" Then
            UnitPerBox = Rw.getElementsByTagName("td")(1).InnerText
            Exit For
        End If
    Next
End With

End Function

我个人更倾向于使用 HTML 对文档进行文本操作,以上所有选项都能检索到你的值=)

给TA打赏
共{{data.count}}人
人已打赏
未分类

XML使用外部DTD进行验证--XML解析器是Python (lxml),该解析器不能从HTTPS端加载外部DTD。

2022-9-8 23:17:38

未分类

检查是否从格式字符串中提供值

2022-9-8 23:17:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索