WebBrowser — получение / чтение данных из общих таблиц без идентификатора, без имени тега, без класса

#vb.net #visual-studio

#vb.net #visual-studio

Вопрос:

В качестве заголовка я пытаюсь прочитать данные из некоторых таблиц на странице.
Я часто использую WebBrowser1.Document.GetElementById для многих подобных вещей, но в этом случае я не могу получить доступ к данным, поскольку на этой странице все таблицы просто определяются <table class="table">

Вот к чему я пытаюсь получить доступ :

 <div class="col-md-6">
    <div class="panel panel-primary">
        <!-- Default panel contents -->
        <div class="panel-heading">
            <h3 class="panel-title">Ryzen 3000 - Mainstream</h3>
        </div>

        <!-- Table -->
        <table class="table">
            <tbody>
                <tr>
                    <th>Ryzen 5 3500</th>
                    <td>3.6 - 4.1</td>
                </tr>
                <tr>
                    <th>Ryzen 5 3500X</th>
                    <td>3.6 - 4.1</td>
                </tr>
                <tr>
                    <th>Ryzen 5 3600</th>
                    <td>3.6 - 4.2</td>
                </tr>
                <tr>
                    <th>Ryzen 5 Pro 3600</th>
                    <td>3.6 - 4.2</td>
                </tr>
                <tr>
                    <th>Ryzen 5 3600X</th>
                    <td>3.8 - 4.4</td>
                </tr>
                <tr>
                    <th>Ryzen 5 3600XT</th>
                    <td>3.8 - 4.5</td>
                </tr>

            </tbody>
        </table>

    </div>
    <!--</panel>-->
</div>  

Я много искал в Интернете, но мне не удалось найти правильное решение.
У кого-нибудь есть подсказки?

Комментарии:

1. Ну, это <TABLE> дочерний элемент <div class="panel panel-primary"> . Вы можете анализировать элементы по имени тега. className Это атрибут элемента. Когда вы получите <DIV> , выполните синтаксический анализ по тегу Назовите его дочерние элементы и получите первый <TABLE> элемент с атрибутом className = "table" . Затем проанализируйте его дочерние элементы с именем тега <TR> и прочитайте каждый <TH> и <TD> подэлемент.

2. Просто проверяю, была ли предоставленная информация полезной. Пожалуйста, дайте нам знать, если вам нужна дополнительная помощь.

Ответ №1:

Я рекомендую вам использовать HtmlAgilityPack и аналитическую формулу Xpath.

Пример кода:
запрос конкретного th текста метки:

     Dim doc As HtmlAgilityPack.HtmlDocument
    Dim path As String = "https://www..."
    Dim web As New HtmlWeb
    doc = web.Load(path)
    Dim node As HtmlAgilityPack.HtmlNode
   'The text within the fourth <th></th>
    node = doc.DocumentNode.SelectNodes("//table[@class='table']//th")(3) 
    Dim st As String = node.InnerText  'Ryzen 5 Pro 3600
  

Запрашивать весь tr текст:

     Dim doc As HtmlAgilityPack.HtmlDocument
    Dim path As String = "https://www..."
    Dim web As New HtmlWeb
    doc = web.Load(path)
    Dim nodes As HtmlAgilityPack.HtmlNodeCollection
    nodes = doc.DocumentNode.SelectNodes("//table[@class='table']//tr")
    For Each node As HtmlNode In nodes
        RichTextBox1.AppendText(node.InnerText)
    Next
  

Результат:
введите описание изображения здесь

Комментарии:

1. Я немного изучил этот пакет гибкости HTML. Я попробовал ваш код, он работает нормально, если я сохраняю только свой HTML-файл, обрезанный в пустой HTML-файл, но он не работает должным образом, если я пытаюсь применить один и тот же код VB ко всей веб-странице. В результате я получаю все желаемые данные, но в грубом виде, все подряд. Поскольку мне сложно это настроить, я подумал использовать некоторые общие регулярные выражения для перехвата и изменения порядка данных, которые я хочу, например, первое регулярное выражение должно перехватывать «Ryzen 5 3500» весь текст до «R», затем с помощью другого кода VB удалите «R», затем продолжайте, покапоследняя строка.

2. Вы можете использовать регулярное выражение для перехвата текста после захвата данных. Пожалуйста, сначала перехватите, а затем перехватите.