Извлечь текст с помощью селектора CSS - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь извлечь конкретный текст с помощью селектора CSS.Вот скриншот части, которую я хотел бы извлечь

enter image description here

Я пробовал

div[id="Section3"]:first-child

, но это не возвращаетчто-нибудь.Я не могу зависеть от расположения элемента по тексту, потому что мне нужно извлечь этот текст, как показано.

Это соответствующий HTML

<div class="ad24123fa4-c17c-4dc5-9aa5-ea007a8db30e-5" style="top:8px;left:218px;width:124px;height:31px;text-align:center;">
    <table width="113px" border="0" cellpadding="0" cellspacing="0">
        <tbody>
            <tr>
                <td>
                    <table width="100%" border="0" cellpadding="0" cellspacing="0">
                        <tbody>
                            <tr>
                                <td align="center">
                                    <span class="fcb900b29f-64d7-453d-babf-192e86f17d6f-7">نظامي</span>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
        </tbody>
    </table>
</div>

Полный код HTML здесь .

Это моя попытка

            On Error Resume Next
            Set ele = .FindElementByXPath("//span[text()='ãäÇÒá']")
            If ele Is Nothing Then sStatus = "äÙÇãí" Else sStatus = "ãäÇÒá"
        On Error GoTo 0

При проверке элемента я заметил, что в консоли есть подсказка об использовании $ 0. Может ли это быть полезным?enter image description here

Что касается двух возможных текстов "نظامي" и "منازل"

1 Ответ

0 голосов
/ 13 декабря 2018

Чтобы использовать xpath с несколькими возможными поисковыми значениями, используйте следующий синтаксис:

//*[text()='نظامي' or text()='منازل']

Селекторы CSS (которые мне подходят):

driver.findElementByCss("#ctl00_ContentPlaceHolder1_CrystalReportViewer1 div.ad071889d2-8e6f-4755-ad7d-c44ae0ea9fca-5 table span").text

, что является сокращением полногоселектор:

#ctl00_ContentPlaceHolder1_CrystalReportViewer1 > tbody > tr > td > div > div.crystalstyle > div.ad071889d2-8e6f-4755-ad7d-c44ae0ea9fca-5 > table > tbody > tr > td > table > tbody > tr > td > span

Вы также можете индексировать в таблицу nodeList

Set matches = html.querySelectorAll("#ctl00_ContentPlaceHolder1_CrystalReportViewer1 div.crystalstyle table")
ActiveSheet.Cells(1, 1) = matches.item(80).innerText

В противном случае:

Чтение из файла HTML Я могу взять последний индекс на основе совпаденийна селектор класса.Для селена вы должны переключиться на:

driver.FindElementsByCss(".fc180999a8-04b5-46bc-bf86-f601317d19c8-7").count

VBA:

Option Explicit
Public Sub test()
    Dim html As HTMLDocument, matches As Object
    Dim fStream  As ADODB.Stream
    Set html = New HTMLDocument
    Set fStream = New ADODB.Stream
    With fStream
        .Charset = "UTF-8"
        .Open
        .LoadFromFile "C:\Users\User\Desktop\Output6.html"
        html.body.innerHTML = .ReadText
        .Close
    End With

    Set matches = html.querySelectorAll(".fc180999a8-04b5-46bc-bf86-f601317d19c8-7")

    ActiveSheet.Cells(1, 1) = matches.item(matches.Length - 1).innerText
End Sub
...