gpt4 book ai didi

html - 从单击后显示的隐藏菜单中提取 WEB PAGE 数据

转载 作者:行者123 更新时间:2023-12-04 10:26:18 25 4
gpt4 key购买 nike

VBA 新手,并试图从网页上的表格中提取数据,该表格仅在单击后出现。

我在 excel 中使用 VBA 宏从 weather.com 中提取数据:

  • 我可以成功地从可见表中提取元素。
  • 尝试从隐藏菜单中提取“日出”和“日落”时间时,我正在拉错误 91。
  • 我想从 table 上的第二天提取日出和日落的时间。

  • 问题:
  • 有没有办法在代码中单击以显示我要提取的数据?
  • 此数据位于源代码中的 SPAN 内 - 我可以从最接近相关 SPAN 的 ClassName 中提取此 innerText 吗?

  • 有人介意看一下代码并帮助我吗?谢谢!

    我可以成功提取“day”、“weather”和“temp”,但无法提取“srise”。

    这是我的 VBA 代码:
    Sub Get_Lancaster()
    Dim request As Object
    Dim response As String
    Dim html As New HTMLDocument
    Dim website As String
    Dim weather As Variant
    Dim temp As Variant
    Dim day As Variant
    Dim srise As Variant

    website = "https://weather.com/weather/5day/l/2db548c2f0fb03c25c0d5c5520a32877082d295d907b06df5eff91cd140165b9"

    Set request = CreateObject("MSXML2.XMLHTTP")

    request.Open "GET", website, False

    request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"

    request.send

    response = StrConv(request.responseBody, vbUnicode)

    html.body.innerHTML = response

    weather = html.getElementsByClassName("description").Item(2).innerText
    temp = html.getElementsByClassName("temp").Item(2).innerText
    day = html.getElementsByClassName("day-detail clearfix").Item(1).innerText
    srise = html.getElementsByClassName("sunrise").Item(1).innerText

    Range("B3").Value = day
    Range("D3").Value = weather
    Range("E3").Value = temp
    Range("G3").Value = srise

    End Sub

    这是在源页面上单击并显示菜单后的源 HTML 代码:

    我正在尝试提取位于底部 SPAN 中的 7:05am:
    <tr classname="clickable open" class="clickable open">
    <td class="twc-sticky-col cell-hide">
    <div classname="twc-table-shadow sticky" class="twc-table-shadow sticky"></div>
    </td>

    <td headers="uv-index" title="Partly cloudy skies. High around 40F. Winds light and variable." data-track-string="ls_24_hour_ls_24_hour_toggle" classname="uv" class="uv">
    <span class="">3 of 10</span>
    </td>

    <td headers="sunrise" title="Partly cloudy skies. High around 40F. Winds light and variable." data-track-string="ls_24_hour_ls_24_hour_toggle" classname="sunrise" class="sunrise">
    <div>
    <span classname="icon icon-font iconset-astro dark icon-sunrise" class="icon icon-font iconset-astro dark icon-sunrise">
    </span>
    <span>7:05 am</span>
    </div>
    </td>

    感谢您查看并帮助一个完全新手,他们在他们的头上!

    -J

    最佳答案

    到目前为止,您做得很好,为您为此付出的努力 +1!

    如果你不介意的话,我想更进一步。

    首先,您必须记住,您在浏览器的开发人员工具中检查元素时所看到的不一定是您在页面的源 HTML 中看到的。

    实际上,在这种情况下,如果您真的右键单击并查看页面的源代码,您将找不到您发布的 HTML 片段。但是,如果您检查感兴趣的元素,您会发现它。

    发生这种情况是因为这部分 HTML 代码是由脚本生成的。您将在 <script></script> 内的页面源代码中找到此脚本。标签(例如,只需搜索“日出”)。这个标签包含一个大字符串和第二个小字符串,都是 JSON 格式。
    script标签看起来像这样:
    <script charSet="UTF-8">window.__data={"transactionId":"a3520089-63d0-4320-bb6e-c6308b6e820d", ... {"startIndex":0}};window.experience={"connectionSpeed":"4g","deviceClass":"desktop"};</script>
    我已将大部分字符串替换为 ...为了可读性。

    您需要的所有数据都在大括号 window.__data 之间的第一个 JSON 字符串 ( {...} ) 中.您将不需要第二个字符串( window.experience )。

    所以基本上你需要的是从响应中分离出这个字符串,然后解析它以获得你想要的信息。

    您可以使用 this 之类的工具检查 JSON 字符串的结构。 .这是它的样子:

    enter image description here

    要解析这样的字符串,您需要添加 this JSON parser到你的项目。按照链接中的安装说明进行操作,您应该可以开始使用了。

    您还需要将以下引用添加到您的项目中(VBE>Tools>References):

    Microsoft XML version 6.0
    Microsoft Scripting Runtime

    话虽如此,这就是我的做法:
    Option Explicit

    Sub weather()
    Dim req As New MSXML2.XMLHTTP60
    Dim url As String, data As String, startOfData As String, endOfData As String
    Dim dataJSON As Object, day As Object

    startOfData = "window.__data=" 'the string of interest starts after this
    endOfData = ";window.experience=" 'the string of interest ends before this

    url = "https://weather.com/weather/5day/l/2db548c2f0fb03c25c0d5c5520a32877082d295d907b06df5eff91cd140165b9"
    With req
    .Open "GET", url, False
    .send
    data = .responseText
    End With

    data = Mid(data, InStr(1, data, startOfData) + Len(startOfData)) 'isolate the string of interest: step 1
    data = Mid(data, 1, InStr(1, data, endOfData) - 1) 'isolate the string of interest: step 2

    Set dataJSON = JsonConverter.ParseJson(data)
    Set dataJSON = dataJSON("dal")("DailyForecast")("geocode:44.49,-71.57:language:en-US:units:e")("data")("vt1dailyForecast")

    For Each day In dataJSON
    Debug.Print day("sunrise")
    Debug.Print day("day")("narrative")
    Debug.Print day("night")("narrative")
    Next day

    End Sub

    出于演示目的,上面的代码仅在即时窗口中打印日出和每天的叙述。记住 JSON 的结构并遵循相同的逻辑,您可以调整代码以打印您需要的任何参数。

    这是输出示例:

    enter image description here

    关于html - 从单击后显示的隐藏菜单中提取 WEB PAGE 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60622979/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com