我可以在VBA中搜索特定样式吗?

时间:2016-05-26 17:48:30

标签: html vba excel-vba web-scraping excel

我一直在寻找任何可能解决此问题的方法。

我公司的所有数据都是通过一个生成静态HTML页面的门户网站访问的。不幸的是,我们的部门无法直接访问服务器,这将使我的生活变得简单,因此我需要页面抓取此门户网站以查找我需要的数据。我的导航很好,我在抓取元素命名或给出ID时非常有经验,但是这也没有。

无论如何,背景不受影响。

我想从页面中抓取一个表格,该表格具有独特的"空单元格:show;":

<TABLE  cellspacing=10 cellPadding=10 border="1" style="empty-cells: show;">

</TABLE>

或者说第一行中的标题始终包含相同的文本字符串。一旦我拥有该表,我就可以操作我需要的数据。这里的人非常敏感,所以我不能提供完整的页面代码。

我知道有很多关于GetElementByRegex的帖子,但我找不到真正解释如何使用它的帖子或网站。相反,他们都希望我安装他们的附加组件,这不是一个选择(我需要学习这个以满足我对知识的渴望)。

为了帮助我添加下面的完整表格代码,删除敏感数据:

<TABLE  cellspacing=10 cellPadding=10 border="0" width=100%>

<tr>

<td>
    <TABLE  cellspacing=10 cellPadding=10 border="1" style="empty-cells: show;">

                <TR class="row0">
                <TD style="width: 25%; background-color: #A3DCF5;"><strong>TITLE:</strong></TD>
                 <TD>LINE1</TD>
                </TR>
               <TR class="row1">
                    <TD>&nbsp;</TD><td>LINE2</td>
                </TR>
                <TR class="row0">
                    <TD>&nbsp;</TD><td>LINE3</td>
                </TR>
                <TR class="row1">
                    <TD>&nbsp;</TD><td>LINE4</td>
                </TR>
                <TR class="row0">
                    <TD>&nbsp;</TD><td>LINE5</td>
                </TR>

    </TABLE>
</td>

</tr>

</TABLE>

还有很多其他表格,所以使用Len检查不会帮助我筛选TD标签。

2 个答案:

答案 0 :(得分:1)

Dim tbls, tbl, tr, j, td, row, sht

Set tbls = IE.document.getElementsByTagName("table")

For Each tbl in tbls
    'item indexes are zero-based (AFAIR)
    If tbl.Rows(0).Cells(1).innerText = "LINE1" Then


        'EDIT: extracting the table contents
        Set sht = ActiveSheet
        row = 3
        For Each tr In t.getelementsbytagname("TR")
            j = 1
            For Each td In tr.getelementsbytagname("TD")
                sht.Cells(row + 1, j).Value = td.innerText
                j = j + 1
            Next
            row = row + 1
        Next

        Exit For 'stop looping
    End If
Next

答案 1 :(得分:0)

Glitch_Doctor的答案毫无疑问地被编辑:

谢谢蒂姆的所有帮助!

以下内容对我来说很完美:

Dim tbls, tbl
Dim L1, L2, L3, L4, L5 As String

Set tbls = IE.Document.getElementsByTagName("table")

For Each tbl In tbls
    If tbl.Rows(0).Cells(0).innerText = "Card Address:" Then

        On Error Resume Next
        L1 = tbl.Rows(0).Cells(1).innerText
        L2 = tbl.Rows(1).Cells(1).innerText
        L3 = tbl.Rows(2).Cells(1).innerText
        L4 = tbl.Rows(3).Cells(1).innerText
        L5 = tbl.Rows(4).Cells(1).innerText

        Exit For
    End If
Next

Worksheets("Sheet2").Range("A1").Value = L1
Worksheets("Sheet2").Range("A2").Value = L2
Worksheets("Sheet2").Range("A3").Value = L3
Worksheets("Sheet2").Range("A4").Value = L4
Worksheets("Sheet2").Range("A5").Value = L5

End Sub