代码之家  ›  专栏  ›  技术社区  ›  Volker Piasta

如何使用XPath(Selenium with VBA)查找HTML元素的内容

  •  0
  • Volker Piasta  · 技术社区  · 4 年前

    我正在寻找一种从网站获取名为“data-testid”的元素内容的方法。此元素在HTML代码中具有不同内容的不同上下文中存在约35次。 我要找的那个像[ 数据testid=“##############-跟随” ],其中#######是一个不断变化的数字。 我使用Excel VBA和Selenium来使用Chrome浏览器。 代码相对简单,大部分都能正常工作,但我无法获得这个特定的内容。 我打开一个网页,查找具有此名称的元素,然后扫描所有找到的元素,如果它们包含单词“follow”。一旦找到,我会提取这个单词之前的数字并将其存储在Excel工作表中。

    Set d = New ChromeDriver
    d.Start "Chrome"
    
    Set Rng = Range(Worksheets("followers").Range("A2"), Worksheets("followers").Range("A2").End(xlDown))
    
    For Each Cell In Rng
        If Cells(Cell.Row, 2).Value2 = "" Then
            user = Cell.Value2
            user = Replace(user, "@", "", 1, 1)         'remove "@"
            d.Get "https://twitter.com/" & user         'navigate to user's page.
            Set Result = d.FindElementsByXPath("//div[@data-testid]")
            If Result.Count > 0 Then
                For i = 1 To Result.Count
                    n = InStr(Result(i).Text, "-follow")
                    If n > 0 Then Exit For
                Next
                Cells(Cell.Row, 2).Value2 = Left(Result(i).Text, n - 1)
            End If
        End If
    Next
    

    这是HTML末尾包含所需元素的部分:

    <div role="button" data-focusable="true" tabindex="0" class="css-18t94o4 css-1dbjc4n r-1niwhzg r-p1n3y5 r-sdzlij r-1phboty r-rs99b7 r-1w2pmg r-1vuscfd r-1dhvaqw r-1ny4l3l r-1fneopy r-o7ynqc r-6416eg r-lrvibr" data-testid="1197328651785789440-follow">
    

    结果[result(1…35)]的每一项都列出了4个布尔属性和一个字符串类型。当我检查它时,字符串总是标签名“div”。没有显示其他属性。偶然间,我尝试了属性“Text”[Result(I).Text],它给出了页面中的一些文本,但35个元素中没有一个显示预期的内容。

    由于我对硒缺乏经验,我需要帮助来了解如何提取这种元素的内容 谢谢

    0 回复  |  直到 4 年前
        1
  •  2
  •   QHarr    4 年前

    使用以运算符结尾的css属性选择器

    .FindElementByCss("[data-testid$='-follow']")
    

    我用几种语言写的,略有不同。如果上面不是selenium basic方法的确切拼写,您可以实例化一个webdriver实例,如果上面的拼写稍有偏差,它应该会显示正确的拼写。

    这通过节点的属性和属性值来定位节点,因此不需要循环。

    在匹配的节点上使用.attribute(“data-testid”)属性来访问属性值。

        2
  •  0
  •   Volker Piasta    4 年前

    多亏了QHarr,我现在找到了完美的解决方案。我希望,这也能帮助其他人,所以我在这里描述一下。 首先,我将搜索更改为。FindElementsByCss(“[data testid$='-follow']”)。 由于搜索元素的更好规范,这只给出了一个结果(而不是之前的35个)。元素名称后的“$”符号指定以下参数是一个部分字符串,因此它会找到任何参数包含“follow”的“data testid”。本文档中只有一个。 然后我将FindElements更改为FindElement,因为现在只剩下一个了。 然后我在搜索中添加了“.Attribute(“data-testid”)”:

    a = d.FindElementByCss("[data-testid$='follow']").Attribute("data-testid")
    

    结果不再是对象“result”,而是我正在寻找的字符串。 剩下的很容易。 非常感谢QHarr!