【问题标题】:Extract innerText from HTML div tags un a local file从本地文件中的 HTML div 标签中提取 innerText
【发布时间】:2019-12-27 19:01:40
【问题描述】:

我能够使用下面的代码从本地 HTML 文件中提取表格,但我不知道如何修改它以从下面的示例 HTML 代码中的嵌套 div 标记中提取内部文本。

Sub HTML_Table_To_Excel() 

Dim htm As Object 
Dim Tr As Object 
Dim Td As Object 
Dim Tab1 As Object
Dim file as String
'Replace the file path with your own 
file = "c:\your_File.html"

'Determine the next file number available for use by the FileOpen function
TextFile = FreeFile

'Open the text file
 Open file For Input As TextFile

 'Create HTMLFile Object 
 Set HTML_Content = CreateObject("htmlfile") 
 HTML_Content.body.innerHtml = Input(LOF(TextFile), TextFile)

 Column_Num_To_Start = 1 
 iRow = 2 
 iCol = Column_Num_To_Start 
 iTable = 0 

'Loop Through Each Table and Download it to Excel in Proper Format 
For Each Tab1 In HTML_Content.getElementsByTagName("table") 
With HTML_Content.getElementsByTagName("table")(iTable) 
    For Each Tr In .Rows 
    For Each Td In Tr.Cells 
        Sheets(1).Cells(iRow, iCol).Select 
        Sheets(1).Cells(iRow, iCol) = Td.innerText 
        iCol = iCol + 1 
        Next Td 
        iCol = Column_Num_To_Start 
        iRow = iRow + 1 
    Next Tr 
End With 

iTable = iTable + 1 
iCol = Column_Num_To_Start 
iRow = iRow + 1 
Next Tab1 

MsgBox "Process Completed" 
End Sub

这是没有表格的 HTML 代码

我想将所有报告行标签类复制到工作表中

【问题讨论】:

  • 请不要发布代码图片。通过edit使用sn-p工具分享html。
  • 您希望值在工作表中的哪个位置?

标签: html excel vba


【解决方案1】:

不要使用后期绑定HTMLFile。这就像穿着木屐跑步。它使用9以下的IE版本,不支持.getElementsByClassName方法或querySelector/querySelectorAll

早期绑定MSHTML.HTMLDocument可通过Microsoft HTML Object Library访问;微软在反垄断和解中支付了大量资金以确保在所有安装中都存在的标准交付库。我能想到的唯一可能出现问题的情况是“为了不顾他们的脸而砍掉他们的鼻子”,IT 部门拒绝在工作机器上为受权限限制的用户安装。您也不会遇到版本问题。

然后您可以使用classattribute 使用我上面提到的任何一种方法来定位感兴趣的节点。 likely bug in the provision of an enumeration method 表示您不能在querySelectorAll 返回的DispStaticNodeList 上使用For Each(与getElementsByClassName 返回的集合不同);但是,您可以使用For Loop 运行节点列表的.Length

更改以下内容以在工作表中写出您想要的位置:

Dim nodeList As Object, i As Long

Set nodeList = HTML_Content.querySelectorAll(".report-row-label") 'or use HTML_Content.getElementsByClassName("report-row-label") method and value

For i = 0 To nodeList.Length - 1
    Worksheets(1).Cells(i + 1, 1) = nodeList.Item(i).innertext
Next

当然,以上是通过 VBE>Tools>References 添加对 Microsoft HTML Object Library 的引用,然后声明和实例化 MSHTML.HTMLDocument 实例。

Dim HTML_Content As MSHTML.HTMLDocument

Set HTML_Content = New MSHTML.HTMLDocument

然后像以前一样用你的文件内容填充变量的.body.innerHTML

使用getElementsByClassName,您应该能够执行以下操作:

Dim nodeList As Object, node As Object, i As Long 'change these to use explicit types here for the element and element collection types

Set nodeList = HTML_Content.getElementsByClassName("report-row-label")

For Each node In nodeList
    Worksheets(1).Cells(i + 1, 1) = node.innerText
    i = i + 1
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2021-10-22
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多