Рейтинг:
6
Maciej Los
Причина, по которой у вас есть элементы "один под другим" вместо "бок о бок", заключается в том, что вы создали 2 разделенных цикла:
'first loop - add products
For Each Products As HtmlNode In div.SelectNodes("//div[@class='marketplace-collectible-list']//a[@class = 'catalog-item-name']")
DataGridView1.Rows.Add(Products.InnerText.Trim())
Next
'second loop - add links
For Each Links As HtmlNode In div.SelectNodes("//div[@class='marketplace-collectible-list']//div[@class = 'image-container']//img//@src")
DataGridView1.Rows.Add(Links.Attributes("src").Value)
Next
Вы должны сразу добавить набор product-link.
Насколько я вижу, в комплект продукта-ссылка:
<div class="row catalog-item-info">...</div>
Итак, вы должны пройти цикл через коллекцию этого
div
s и выберите один узел для продукта, а затем для ссылки.
'create the datatable as a data source for the datagridview
Dim dt As DataTable = New DataTable()
dt.Columns.Add(New DataColumn("Product"))
dt.Columns.Add(New DataColumn("Link"))
'connect to the site
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Dim siteaddress As String = "https://www.hobbydb.com/marketplaces/hobbydb/catalog_items?utf8=%E2%9C%93&q=thanos+sideshow&commit=Go"
Dim doc As HtmlDocument = New HtmlWeb().Load(siteaddress)
Dim div As HtmlNode = doc.DocumentNode.SelectSingleNode("//div[@class='marketplace-collectible-list']")
'get data
For Each item As HtmlNode In div.SelectNodes("*//div[@class = 'row catalog-item-info']")
Dim product As HtmlNode = item.SelectSingleNode("*//a[@class = 'catalog-item-name']")
Dim link As HtmlNode = item.SelectSingleNode("*//div[@class = 'image-container']//img//@src")
dt.Rows.Add(New Object(){product.InnerText.Trim(), link.Attributes("src").Value})
Next
'bind data
DataGridView1.DataSource = dt
Примечание: Не проверено! Но это должно работать нормально.
[РЕДАКТИРОВАТЬ]
Чтобы получить sub-div в контексте конкретного HtmlNode, необходимо использовать "
*
Для получения более подробной информации, пожалуйста, смотрите:
Примеры XPath | Microsoft Docs[
^]
Проверьте обновленный код.
Удачи вам!
Member 12919322
Спасибо за ответ. Но не работает так, как я хочу.
Первый :
С концом у меня есть ошибки
dt.Rows.Add(New Object()() {product.InnerText.Trim(), link.Attributes("src").Value})
Я меняюсь на:
dt.Rows.Add(product.InnerText.Trim(), link.Attributes("src").Value)
и работает нормально, но(см. "Два")
Два:
Берите только первое значение, а не остальные (умножьте первое значение на select для каждого).
Может быть потому что :
Dim div As HtmlNode = doc.DocumentNode.SelectSingleNode("//div[@class='marketplace-collectible-list']")
Maciej Los
Проверьте обновленный ответ. Я сделал несколько незначительных ошибок, которые были исправлены несколько секунд назад.
Member 12919322
Мацей Лос, ты слышишь мой комментарий ?
Maciej Los
Пожалуйста, смотрите обновленный ответ (и код).
Member 12919322
Спасибо за помощь. Работает очень хорошо. Теперь у меня есть хороший пример.
Большое вам спасибо, Мацей Лос.
Maciej Los
Самое лучшее "спасибо" - это когда вы принимаете (используя зеленую кнопку) и повышаете голос (используя систему голосования-в правом верхнем углу) мой ответ.
Member 12919322
Сделать мой виртуальный герой !
Maciej Los
Спасибо.
Ваше здоровье!
Мацей