#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. Вы можете использовать регулярное выражение для перехвата текста после захвата данных. Пожалуйста, сначала перехватите, а затем перехватите.