Member 12919322 Ответов: 1

Htmlagilitypack datagridview для каждого


Привет, у меня есть datagridview, но значения находятся один под одним.
Я стараюсь держаться рядом друг с другом.
В чем же проблема ?

DataGridView1.ColumnCount = 2
        DataGridView1.Columns(0).Name = "Products"
        DataGridView1.Columns(1).Name = "Links"


        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
        Dim link 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(link)
        Dim div As HtmlNode = doc.DocumentNode.SelectSingleNode("//div[@class='marketplace-collectible-list']")
        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
        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

Как я делаю, чтобы поймать все эти значения для datagridview, как это.

DataGridView1.Rows.Add(Products.InnerText.Trim(),Links.Attributes("src").Value)


Спасибо вам.

Что я уже пробовал:

Я пробую много советов, но ничего.

Afzaal Ahmad Zeeshan

Что значит "один под одним"? Вы добавляете строки, они появляются один под одним.

Member 12919322

У меня это есть
https://ibb.co/yNbQxHQ
Но я хочу этого.
https://ibb.co/DVWPSC9

1 Ответов

Рейтинг:
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>
Итак, вы должны пройти цикл через коллекцию этого divs и выберите один узел для продукта, а затем для ссылки.
'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

Спасибо.
Ваше здоровье!
Мацей