Синтаксис Xpath для строки HtmlAgilityPack - PullRequest
0 голосов
/ 06 октября 2018

Я использую следующий код:

Dim cl As WebClient = New WebClient()
Dim html As String = cl.DownloadString(url)
Dim doc As HtmlAgilityPack.HtmlDocument = New HtmlAgilityPack.HtmlDocument()
doc.LoadHtml(html)

Dim table As HtmlNode = doc.DocumentNode.SelectSingleNode("//table[@class='table']")

For Each row As HtmlNode In table.SelectNodes(".//tr")
   Dim inner_text As String = row.InnerHtml.Trim()

Next

Мой inner_text для каждой строки выглядит следующим образом, с разными годами и данными:

       "<th scope="row">2015<!-- --> RG Journal Impact</th><td>6.33</td>"

Каждая строка имеетЭлемент th и элемент td, и я пробовал разные способы получения значения, но я не могу тянуть их один за другим, зацикливая коллекцию столбцов.Как я могу получить только элемент th и элемент td, используя правильный синтаксис Xpath?

Пока я не смогу использовать лучший код, я буду использовать стандартные функции синтаксического анализа:

Dim hname As String = row.InnerHtml.Trim()
Dim items() As String = hname.Split("</td>")
Dim year As String = items(1).Substring(items(1).IndexOf(">") + 1)

Dim value As String = items(4).Substring(items(4).IndexOf(">") + 1)
If value.ToLower.Contains("available") Then
    value = ""

End If

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете продолжить с запроса строки:

Option Infer On
Option Strict On

Imports HtmlAgilityPack

Module Module1

    Sub Main()
        Dim h = "<html><head><title></title></head><body>
<table class=""table"">
<tr><th scope=""row"">2015<!-- --> RG Journal Impact</th><td>6.33</td></tr>
<tr><th scope=""row"">2018 JIR</th><td>9.99</td></tr>
</table>
</body></html>"

        Dim doc = New HtmlAgilityPack.HtmlDocument()
        doc.LoadHtml(h)

        Dim table = doc.DocumentNode.SelectSingleNode("//table[@class='table']")

        For Each row In table.SelectNodes(".//tr")
            Dim yearData = row.SelectSingleNode(".//th").InnerText.Split(" "c)(0)
            Dim value = row.SelectSingleNode(".//td").InnerText
            Console.WriteLine($"Year: {yearData} Value: {value}")
        Next

        Console.ReadLine()

    End Sub

End Module

Выходы:

Год: 2015 Значение: 6,33
Год: 2018 Значение: 9.99

...