HtmlAgilitypack div-узел - как сначала узнать, что находится внутри div, а затем проанализировать на основании этого - PullRequest
0 голосов
/ 26 апреля 2018

Я делаю разбор веб-сайтов своих поставщиков, чтобы узнать текущие цены на товары. Я использую vb.net и приложение для Windows, которое я написал в visual studio 2015

Один продавец недавно изменил способ отображения цен Цены на товары находятся внутри общего основного деления. Но цены могут быть внутри таблицы или простого div

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

Обратите внимание на HTML ниже, что это основной div для обеих схем ценообразования

<div class="price" id="itemPrice12345">
  .. a table or a simple price div are here.
</div>

Так выглядит div, когда он содержит таблицу

<div class="price" id="itemPrice12345">
<table class="bglt"><tbody>
<tr>
<td class="texttable" nowrap="">1 to 9</td>
<td class="texttable">$9.93</td>
</tr></tbody></table>
</div> 

Я анализирую цены вне таблицы, используя этот код выбора узла

Dim tables As HtmlAgilityPack.HtmlNodeCollection
tables = WebPageDocument.DocumentNode.SelectNodes("//*[contains(@id,'itemPrice')]/div[1]/table")

Затем я перебираю строки таблицы "./tr" и столбцы таблицы "./td", чтобы выбрать цены


Тот же основной div без таблицы выглядит следующим образом

<div class="price" id="itemPrice12345">
<div class="price firstprice">$3.50</div>   
</div> 

Я анализирую цену из этого простого div, используя этот код выбора узла

Dim PriceNode As HtmlAgilityPack.HtmlNodeCollection
PriceNode = WebPageDocument.DocumentNode.SelectNodes("//*[contains(@id,'itemPrice')]/div[1]/div")
ItemPrice = PriceNode(0).InnerText

У меня вопрос, как я могу определить, содержит ли основной ценовой элемент предмет таблицы или простой ценовой элемент внутри? Как только я это узнаю, я могу отправить разбор в соответствующий раздел кода. Итак, я думаю, мне нужно сначала узнать, что находится внутри основного div, но я не уверен, как это сделать? Спасибо за любую помощь

1 Ответ

0 голосов
/ 26 апреля 2018

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

Dim _itemPriceSelector As String = "//*[contains(@id,'itemPrice')]/div[1]"
Dim _divSelector As String = _itemPriceSelector & "/div"
Dim _tableSelector As String = _itemPriceSelector & "/table"

If doesNodeExist(_tableSelector) Then

    Dim tables As HtmlAgilityPack.HtmlNodeCollection
    tables = WebPageDocument.DocumentNode.SelectNodes(_tableSelector )

ElseIf doesNodeExist(_divSelector) Then

    Dim PriceNode As HtmlAgilityPack.HtmlNodeCollection
    PriceNode = WebPageDocument.DocumentNode.SelectNodes(_divSelector)
    ItemPrice = PriceNode(0).InnerText

End If

Private Function doesNodeExist(selector) As Boolean
    If IsNothing(WebPageDocument.DocumentNode.SelectSingleNode(selector)) Then
        Return False
    Else
        Return True
    End If
End Function
...