【问题标题】:Read values from graph on website using excel macro使用 excel 宏从网站上的图表中读取值
【发布时间】:2021-03-26 07:25:56
【问题描述】:

我有一个问题,我自己找不到解决方案。我试图从以下网站读出值:https://datawrapper.dwcdn.net/6E03v/580/。我想我已经设法在网站的代码中找到了相应的部分 THIS ONE。根据我的理解,可以使用标签“span”或类“fg”找到这些值,但它们似乎都不起作用。这是我在使用标签“span”的版本中使用的代码:

Dim WertFG As Selenium.WebElement
Dim WerteFG As Selenium.WebElements
Dim strTargetTab As String
Dim lgNaechsteFreieZeileZwiSpTblFaelleNachAlter As Long
Dim lgSpalte As Long
Dim lgNaechsteFreieZeileReiterNTVCoronadaten As Long


'Wertzuweisung Variablen
    Set ChromeBrowser = New Selenium.ChromeDriver
    

'Chrome starten und auf die relevante Seite für die gesuchte TabelleCoronaVirusPandemieParameter gehen
    ChromeBrowser.Start baseUrl:="https://datawrapper.dwcdn.net/"
    ChromeBrowser.Get "/6E03v/577/"
    
    
'Werte auslesen
    strTargetTab = ThisWorkbook.Worksheets("ZwiSp Tbl Fälle nach Alter").Name
    ThisWorkbook.Worksheets(strTargetTab).Activate
    ThisWorkbook.Worksheets(strTargetTab).Range("A1:A50").ClearContents
    
    Application.Wait (Now + TimeValue("00:00:03"))


'Tabellenwerte auslesen
    Set WerteFG = ChromeBrowser.FindElementsByTag("span")
    lgNaechsteFreieZeileZwiSpTblFaelleNachAlter = ThisWorkbook.Worksheets(strTargetTab).Cells(Rows.Count, 1).End(xlUp).Row + 1
    lgSpalte = 1
        
        
    For Each WertFG In WerteFG
        ThisWorkbook.Worksheets(strTargetTab).Cells(lgNaechsteFreieZeileZwiSpTblFaelleNachAlter, lgSpalte).Value = WertFG.Text
        lgNaechsteFreieZeileZwiSpTblFaelleNachAlter = lgNaechsteFreieZeileZwiSpTblFaelleNachAlter + 1
    Next WertFG
        
        
    ChromeBrowser.Close

有人有想法吗,为什么这不起作用?是否与图表上的值仅在您将鼠标悬停在图表的相应部分上方时显示的事实有关?

感谢您的帮助! 奥利弗

补充: 我想做的事: 将标签“span”的所有值读出到 Excel 中的工作表中。每个值都应写在工作表中的连续单元格中,即 A2、A3、...。

宏的作用: 读出前 4 行标签“span”的值,然后提供 11 行没有值,然后再次显示网站元素“span”的剩余值。我假设如果宏可以正常工作,那么在 11 个空行中,将显示图表的数字(这是我需要的)。我还在这篇文章中附上了读出结果的屏幕截图: Read Out Results Excel Worksheet

【问题讨论】:

  • “它们似乎都不起作用” 不是有用的错误描述。而是描述出了什么问题,你得到了哪些错误,你的代码在哪里或实际做了什么,而不是你期望它做什么。还知道什么已经有效可能很有用。 WerteFG 是否包含任何元素?请注意,此ChromeBrowser.FindElementsByTag("span") 将在整个 html 代码中找到 all span 元素。
  • 感谢您的回复,很抱歉第一轮没有准确,仍然需要学习如何在“程序员”社区中发帖。我知道我设计代码的方式将读出所有跨度元素。我只有有限的技能,而且没有太多,所以设计对我来说很好。我已对原始帖子进行了补充以提供更多信息。

标签: excel vba web-scraping


【解决方案1】:

在从该页面拉取下载之前需要等待。

另外,最好针对特定的跨度,例如

Dim values As webelements, labels As webelements, r As Long

Set values = chromebrowser.FindElementsByCss(".dontshow span")
Set labels = chromebrowser.FindElementsByCss(".series span")
r = 0

For i = 1 To labels.Count Step 2
    Debug.Print labels.Item(i).Text
    Debug.Print values(i).Text
    Debug.Print values(i + 1).Text
    r = r + 1
Next

但是,数据来自您可以下载的 csv。 csv 有一个时间戳参数,它可能有助于缓存。我怀疑服务器对它做了很多。 @TimWilliams 编写了一个非常好的小函数来生成 unix 时间戳,您可以使用它来构建 csv 下载 url。

因此,如果您在该页面上需要其他内容,您只需 chromebrowser.get 到构建的 url 即可下载:

Public Sub GetCovidNumbers()
    
    Dim downloadUrl As String
    
    downloadUrl = "https://static.dwcdn.net/data/6E03v.csv?v=" & CStr(toUnix(Now))
    Debug.Print downloadUrl
    
    'd.get downloadUrl

End Sub

Public Function toUnix(dt) As Long
'https://stackoverflow.com/a/12326121 @TimWilliams
    toUnix = DateDiff("s", "1/1/1970", dt)
End Function

或者,如果你只需要,你可以设置一个下载路径并使用urlmon从构造的url下载,例如

Public Const folderName As String = "C:\Users\<user>\Desktop\covid.csv" '<=Change as required

Public Sub downloadCSV()
    Dim ret As Long
    ret = URLDownloadToFile(0, "https://static.dwcdn.net/data/6E03v.csv?v=" & CStr(toUnix(Now)), folderName, BINDF_GETNEWESTVERSION, 0)
End Sub

在所有情况下,您都需要整理输出中的标题和年龄类别 5-9。我会简单地忽略它们,因为它们是常量,因此您可以将它们存储在其他地方。

【讨论】:

  • 非常感谢您的帮助!我非常喜欢下载 CSV 文件的程序,并将其实施到我的程序中,这正是我想要的方式。再次感谢!
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多