如何正确编写CSS属性选择器以提取所有id属性?

时间:2018-04-27 11:48:36

标签: html css vba web-scraping css-selectors

情况:

我目前正在尝试使用here中的CSS选择器练习在VBA中重现具有语法[attr]的属性选择器。

选择器用于根据给定属性的值选择元素。

预期结果:

在我添加的html示例中,使用id尝试获取所有 html.querySelectorAll("[id]")属性的预期结果在运行时以黄色突出显示。

问题:

我没有获得与id元素相关的信息 - 黄色突出显示的位 - 我正在获得更多文本。看起来几乎所有东西都有一些重复的材料。

我尝试了什么:

  1. 我已经阅读了大量的CSS资源。它们都表示相同的语法。 *参见样本参考。我还没有找到一个匹配良好的VBA示例,所以我可能无法正确转换语法。
  2. 根据上述内容, 仅作为测试 ,我尝试更改选择器语法以定位特定的id。这非常有效。
  3. 例如:

     Set a = html.querySelectorAll("[id=""my-Address""]")
    

    在我的代码示例中,这产生了预期值:

    <p id="my-Address">I live in Duckburg</p>
    
    1. 我尝试从[]移除[id]Option Explicit '[attribute] [target] Selects all elements with a target attribute e.g. [id] Public Sub Test13() Dim html As MSHTML.HTMLDocument, i As Long Set html = GetTestHTML() Dim a As Object 'Set a = html.querySelectorAll("[id=""my-Address""]") Set a = html.querySelectorAll("[id]") For i = 0 To a.Length - 1 Debug.Print a(i).innerText Next i End Sub Public Function GetTestHTML(Optional ByVal url As String = "https://www.w3schools.com/cssref/trysel.asp") As HTMLDocument Dim http As New XMLHTTP60 Dim html As New HTMLDocument With http 'Set http = CreateObject("MSXML2.XMLHttp60") .Open "GET", url, False .send html.body.innerHTML = .responseText Set GetTestHTML = html End With End Function 没有向立即窗口打印任何内容。
    2. 这个SO question有一个答案提到Chrome浏览器,我正在使用的浏览器,因为某些CSS选择器存在问题,但我不认为这适用于我的方案。
    3. 问题:

      如何在VBA中正确编写CSS选择器,以从给定的webpage中提取具有id属性的所有元素?

      代码:

      <div class="noSel">
      <h1><span class="markup">&lt;h1&gt;</span>Welcome to My Homepage<span class="markup">&lt;/h1&gt;</span></h1>
      
      <div id="helpIntro">
      <span class="markup">&lt;div class="intro"&gt;</span>
      <div class="intro">
      <p style="margin-top:4px;"><span class="markup">&lt;p&gt;</span>My name is Donald <span id="Lastname" style="border-color: rgb(255, 102, 102); background-color: rgb(255, 255, 153);"><span class="markup">&lt;span id="Lastname"&gt;</span>Duck.<span class="markup">&lt;/span&gt;</span></span><span class="markup">&lt;/p&gt;</span></p>
      <p id="my-Address" style="border-color: rgb(255, 102, 102); background-color: rgb(255, 255, 153);"><span class="markup">&lt;p id="my-Address"&gt;</span>I live in Duckburg<span class="markup">&lt;/p&gt;</span></p>
      <p style="margin-bottom:4px;"><span class="markup">&lt;p&gt;</span>I have many friends:<span class="markup">&lt;/p&gt;</span></p>
      </div>
      <span class="markup">&lt;/div&gt;</span>
      </div>
      
      <br>
      <div class="helpUl" style="border-color: rgb(255, 102, 102); background-color: rgb(255, 255, 153);">
      <span class="markup">&lt;ul id="Listfriends&gt;</span>
      <ul id="Listfriends" style="margin-top:0px;margin-bottom:0px;">
      
      <li><span class="markup">&lt;li&gt;</span>Goofy<span class="markup">&lt;/li&gt;</span></li>
      <li><span class="markup">&lt;li&gt;</span>Mickey<span class="markup">&lt;/li&gt;</span></li>
      <li><span class="markup">&lt;li&gt;</span>Daisy<span class="markup">&lt;/li&gt;</span></li>
      <li><span class="markup">&lt;li&gt;</span>Pluto<span class="markup">&lt;/li&gt;</span></li>
      </ul>       
      <span class="markup">&lt;/ul&gt;</span>
      </div>
      
      <ul style="display:none;"></ul>
      <p><span class="markup">&lt;p&gt;</span>All my friends are great!<span class="markup">&lt;br&gt;</span><br>But I really like Daisy!!<span class="markup">&lt;/p&gt;</span></p>
      
      <p lang="it" title="Hello beautiful"><span class="markup">&lt;p lang="it" title="Hello beautiful"&gt;</span>Ciao bella<span class="markup">&lt;/p&gt;</span></p>
      
      
      <h3><span class="markup">&lt;h3&gt;</span>We are all animals!<span class="markup">&lt;/h3&gt;</span></h3>
      
      <p><span class="markup">&lt;p&gt;</span><span><b><span class="markup">&lt;b&gt;</span>My latest discoveries have led me to believe that we are all animals:<span class="markup">&lt;/b&gt;</span></b></span><span class="markup">&lt;/p&gt;</span></p>
      
      <div class="helpTable" style="width:220px;">
      <span class="markup">&lt;table&gt;</span>
      <ul style="display:none;"></ul>
        <div class="noSel" style="margin-top:10px;">

      HMTL预期结果为黄色:

      &#13;
      &#13;
      ="**Data Reporting "&Format(today,"dd, MMM yyyy")&"**"
      
      &#13;
      &#13;
      &#13;

      参考文献:

      1. Mozilla:CSS selectors
      2. w3schools CSS Selector Reference
      3. VBA/DOM - Get elements based on attribute
      4. Unable to get CSS Attribute selector to work
      5. Chrome and CSS attribute selector
      6. 项目参考:

        *通过VBE&gt;工具&gt;参考

        Project references

1 个答案:

答案 0 :(得分:1)

原来,有两个错误需要纠正。

  1. 源网站HTML缺少"部分中的结尾<ul id="Listfriends>。这应该是<ul id="Listfriends">。这意味着CSS选择器会进行匹配。
  2. 我从页面中带走了所有HTML,并询问实际上我只想要特定iframe中的HTML以便仅使用预期的ID。

代码:

Option Explicit
Public Sub GetInfo()
    Dim html As MSHTML.HTMLDocument, i As Long
    Set html = GetTestHTML()
    Dim a As Object
    html.body.innerHTML = html.querySelector("#iframeResult").document.getElementById("selectorResult").innerHTML
    Set a = html.querySelectorAll("[id]")

    For i = 0 To a.Length - 1
        Debug.Print a(i).innerText
    Next i
End Sub

Public Function GetTestHTML(Optional ByVal url As String = "https://www.w3schools.com/cssref/trysel.asp") As HTMLDocument
    Dim http As New XMLHTTP60
    Dim html As New HTMLDocument
    With http                                    'Set http = CreateObject("MSXML2.XMLHttp60")
        .Open "GET", url, False
        .send
        html.body.innerHTML = Replace(.responseText, """Listfriends", """Listfriends""")
        Set GetTestHTML = html
    End With
End Function