【问题标题】:Can I web scrape for a particular style in VBA?我可以在 VBA 中抓取特定样式的网页吗?
【发布时间】:2018-06-20 05:29:16
【问题描述】:

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

我公司的所有数据都是通过生成静态 HTML 页面的门户网站访问的。不幸的是,我们的部门无法直接访问服务器,这将使我的生活变得轻松,所以我需要通过页面抓取这个门户来找到我需要的数据。我的导航很好,我在抓取元素命名或给定 ID 的地方非常有经验,但是这两者都没有。

不管怎样,背景不碍事。

我想从页面中抓取一个具有独特样式“empty-cells: 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 标签。

【问题讨论】:

  • 我曾经有过类似的事情(也许),我做了很多试验和错误,并在表格集合中循环(使用td标签)并返回表格,其中包含我想要的行数(那时我知道我有正确的表),然后我测试了行和列中的值。我相信表格的第一行和第二列的 sytnax 将是 td.Rows(0).Cells(1).InnerTextThis link 并不完美,但它会给你一个开始。
  • 谢谢,我看看这个,看看能不能解决。

标签: html vba excel web-scraping


【解决方案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

【讨论】:

  • 谢谢,今天因为银行假日周末很忙,但我明天会看看这个。
  • 这已经找到表格了,所以谢谢你的帮助,我就是不知道如何复制实际的表格数据?
  • 现在解决了,谢谢,答案已编辑为原始问题!你是明星,干杯。
【解决方案2】:

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

【讨论】:

  • @Glitch_Doctor 如果您希望将此作为您自己的答案(作为答案)发布,请留言,可以将其删除。
  • 谢谢@QHarr,我可能会看看我所有的旧问题,因为这对我来说还处于早期阶段,所以我可能会再次犯罪......我不需要为此发布它自己问答
  • @Glitch_Doctor 感谢您告诉我。
猜你喜欢
  • 2022-01-11
  • 2019-12-17
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多