【问题标题】:How to extract something between <!-- --> using VBA?如何使用 VBA 在 <!-- --> 之间提取一些东西?
【发布时间】:2018-02-06 07:35:41
【问题描述】:

我正在尝试使用 VBA 抓取页面。我知道如何通过 id classtag 名称获取元素。但是现在我遇到了这个标签

<!-- <b>IE CODE : 3407004044</b> -->

现在在互联网上搜索后,我知道这是 HTML 中的注释,但我无法找到该元素的标签名称,如果它完全符合标签的条件。我应该使用

documnet.getelementsbytagname("!") ?

如果没有,我还能如何提取这些 cmets ?

编辑: 我在 tr 元素中有一堆这些 td 元素,我想提取 IE Code : 3407004044 下面是一组更大的 HTML 代码:

<tr align="left">
    <td width="50%" class="subhead1">                                                           

    ' this is the part that I want to extract
    <!-- <b>IE CODE : 3108011111</b> -->                                
    </td>
    <td rowspan="9" valign="top">
    <span id="datalist1_ctl00_lbl_p"></span>
    </td>
</tr>

谢谢!

【问题讨论】:

  • 你能把更大的sn-p贴在这里做实验吗?前几天,在处理一个站点时,我在解析来自 cmets 的数据时遇到了这样的困难。然而,问题是 IE 可以非常有效地处理它。您在脚本中的其他地方出错了。
  • 我添加了 HTML sn-p
  • 是评论节点。由于浏览器不支持 XPath,因此无法使用 IE 搜索它。虽然您可以简单地使用 txt = document.documentElement.innerHTML 从页面中读取所有 HTML,然后使用正则表达式搜索目标代码:IE CODE : \w+

标签: html vba internet-explorer web-scraping


【解决方案1】:

像这样试一试,如果你进一步修复它,它会起作用:

Option Explicit

Public Sub TestMe()

    Dim myString    As String
    Dim cnt         As Long
    Dim myArr       As Variant

    myString = "<!-- <b>IE CODE : Koj sega e</b> -->blas<hr>My Website " & _
                    "is here<B><B><B><!-- <b>IE CODE : nomer </b> -->" & _
                    "is here<B><B><B><!-- <b>IE CODE : 1? </b> -->"

    myString = Replace(myString, "-->", "<!--")
    myArr = Split(myString, "<!--")

    For cnt = LBound(myArr) To UBound(myArr)
        If cnt Mod 2 = 1 Then Debug.Print myArr(cnt)
    Next cnt

End Sub

这就是你得到的:

 <b>IE CODE : Koj sega e</b> 
 <b>IE CODE : nomer </b> 
 <b>IE CODE : 1? </b> 

思路如下:

  • --&gt; 替换为&lt;!--
  • &lt;!--分割输入
  • 从数组中获取每一秒的值

在某些可能的情况下,它不起作用,例如如果你在文中某处写有--&gt;&lt;!--,但一般情况下应该没问题。

【讨论】:

  • 但是这个 HTML 代码在网页上,要对字符串执行此操作,我必须先从网页中取出字符串。我该怎么做?
  • @Digvijay - 我知道的最好方法 - 谷歌“美丽汤”并花 2 小时阅读教程 :)
  • 不能使用VBA和Internet Explorer吗?这里可以使用getelementsbytagname吗?
  • @Digvijay - 是的。但是漂亮的汤更好:) 但是,在 VBA 中将 HTML 转换为字符串应该可以在 Google 和 SO 中找到 - stackoverflow.com/questions/11805389/…
  • @Vitayata 是的,我已经四处搜索了,我也使用过这种通过 tagnameidclassname 获取数据的方法,我的问题是 &lt;!-- IE CODE : 3407004044 --&gt; 的标记名是什么?.如果我知道 cmets 的标记名是什么,我将能够使用 getelementsbytagname(" ") 提取它
【解决方案2】:

您可以使用 XPath:

substring-before(substring-after(//tr//comment(), "<b>"), "</b>")

获取所需数据

【讨论】:

  • 看不懂,怎么用?
  • 我不熟悉 VBA。您使用什么工具/技术?我无法识别代码语法documnet.getelementsbytagname()...看起来就像document.getElementsByTagName()...您使用的是纯VBA 还是可以接受JavaScript 的工具。你能用你使用的确切代码更新你的问题吗
  • @Digvijay,哦,我刚刚发现 VBA 没有允许使用 XPath 的内置函数。我认为它会类似于document.getElementByXpath()...但是如果您仍想尝试实现 XPath 解决方案,则有一个workaround...
  • 感谢您的帮助。 :)
猜你喜欢
  • 2022-09-23
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多