Htmlagilitypack - 같은 줄에서 두 개의 다른 노드를 읽고 listview에 추가합니다.

html html-agility-pack html-table selectnodes vb.net

문제

모든 참가자 이름 값을 (span class = text) 및 (class = contenu)와 함께 shortname 값으로 가져오고 웹 페이지에 similiart로 표시되는 listview 항목의 다른 coloumn에 추가하려고합니다. . 사용자는 참가자의 전체 이름을 볼 수 있으며 개별 참여자 브랜드 (약식 이름)를 클릭하여 세부 정보를 얻을 수도 있습니다.

Imports HtmlAgilityPack

Public Class Form1

Dim web As New HtmlWeb
Dim doc As HtmlDocument = web.Load("http://www.eurovent-certification.com/en/Certified_products/Access_by_programme.php?rub=04&srub=01&ssrub=&lg=en&select_prog=AHU")
Dim ParticipantNodesShort As HtmlNodeCollection = doc.DocumentNode.SelectNodes("/html/body/table/tr/td[2]/table[4]/tr[2]/td[2]//a[@class='contenu']")
Dim ParticipantNodesLong As HtmlNodeCollection = doc.DocumentNode.SelectNodes("/html/body/table/tr/td[2]/table[4]/tr[2]/td[2]//span[@class='texte']")


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    ' Adding ListView Columns
    ListView2.Columns.Add("Participant's contact - Full Name", 250, HorizontalAlignment.Left)
    ListView2.Columns.Add("Brand Name", 100, HorizontalAlignment.Left)
    ListView2.Columns.Add("Brand Name", 100, HorizontalAlignment.Left)
    ListView2.Columns.Add("Brand Name", 100, HorizontalAlignment.Left)
    ListView2.Columns.Add("Brand Name", 100, HorizontalAlignment.Left)

End Sub


Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

          Dim web As New HtmlWeb
    Dim doc As HtmlDocument = web.Load("http://www.eurovent-certification.com/en/Certified_products/Access_by_programme.php?rub=04&srub=01&ssrub=&lg=en&select_prog=AHU")
    Dim ParticipantNodes As HtmlNodeCollection = doc.DocumentNode.SelectNodes("/html/body/table/tr/td[2]/table[4]/tr[2]/td[2]//span[@class='texte'] | /html/body/table/tr/td[2]/table[4]/tr[2]/td[2]//a[@class='contenu']")
    Dim participantname(20) As String
    Dim brandname(50) As String
    Dim participantcount As Integer = 0
    Dim brandcount As Integer = 0

    For Each item As HtmlNode In ParticipantNodes
        If item.Name = "span" Then
            Debug.Print(participantname(participantcount))
            participantname(participantcount) = item.InnerText.Replace(vbLf, "").Replace(vbCr, "").Replace(vbTab, "")
            participantcount = participantcount + 1
        Else
            If Not item.Attributes.Count = 3 Then
                brandname(brandcount) &= String.Format(" [{0}]", item.InnerText.Replace(vbLf, "").Replace(vbCr, "").Replace(vbTab, ""))
                brandcount = brandcount + 1
            End If
        End If
        ListView2.Items.Add(participantname(participantcount) & " " & brandname(brandcount))

    Next
End Sub
End Class

문제를 단순화하십시오.

이것은 전체 페이지에서 참여자 이름과 브랜드를 보여주는 부분입니다 (일부에는 하나가 있고 다른 일부에는 2, 3 또는 4가 있음)

아래처럼; Mekar srl (참가자 이름)에는 쉼표로 구분 된 4 가지 브랜드가 있습니다 (Eden, Mekar VENCO, Venticlima)

MEKAR srl (EDEN, MEKAR, VENCO, VENTILCLIMA)

그러나 그들 중 일부는 단지 하나입니다;

아래 예와 같이; Menegra Gmbh (참가자 이름)는 Menegra MENERGA GmbH (Menerga)

그래서 나는이 데이터를 페이지와 함께 거의 동일한 논리를리스트 뷰에 쓰려고 노력할 것이다.

첫 번째 열에는 참여자 이름이 나열되고 두 번째 열에 동일한 행이 표시됩니다. 브랜드 이름이 나열됩니다 (또는 같은 행의 첫 번째 열, 세 번째 및 네 번째 열)

관계없이 listview 내가 웹 페이지에서 배열 형식 문자열에 기록하고 나중에 listview에서 그들을 표시하는 데이터를 잡아 아이디어가 필요합니다.

위의 코드를 통해 나는 모든 노드를 연속적으로 읽으며 이들 간의 관계를 잃어 버렸습니다 (여러 브랜드의 참가자 이름과 같은)

이 진술이 더욱 분명 해져서 더 많은지지를 얻길 바랍니다.

문안 인사

알리

수락 된 답변

좋아, 그래서 내가 ListView에 몇 가지 빠른 검색을 했어 ... 여기 결과입니다.

여기에 이미지 설명을 입력하십시오.

Imports HtmlAgilityPack

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    ListView2.Columns.Add("Participant's contact - Full Name", 250, HorizontalAlignment.Left)
    ListView2.Columns.Add("Brand Name", 100, HorizontalAlignment.Left)
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim web As New HtmlWeb
    Dim doc As HtmlDocument = web.Load("http://www.eurovent-certification.com/en/Certified_products/Access_by_programme.php?rub=04&srub=01&ssrub=&lg=en&select_prog=AHU")
    Dim ParticipantNodes As HtmlNodeCollection = doc.DocumentNode.SelectNodes("/html/body/table/tr/td[2]/table[4]/tr[2]/td[2]//span[@class='texte'] | /html/body/table/tr/td[2]/table[4]/tr[2]/td[2]//a[@class='contenu']")
    Dim ColumnCount As Integer = 1
    Dim TempListItem As New ListViewItem
    For Each item As HtmlNode In ParticipantNodes
        If item.Name = "span" Then
            ColumnCount = 1
            Dim Name As String = item.InnerText.Replace(vbLf, "").Replace(vbCr, "").Replace(vbTab, "")
            TempListItem = ListView1.Items.Add(Name)
        Else
            If Not item.Attributes.Count = 3 Then
                ColumnCount += 1
                If ColumnCount > ListView1.Columns.Count Then
                    ListView1.Columns.Add("Brand Name", 100, HorizontalAlignment.Left)
                End If
                Dim SubName As String = item.InnerText.Replace(vbLf, "").Replace(vbCr, "").Replace(vbTab, "")
                TempListItem.SubItems.Add(SubName)
            End If
        End If
    Next
    Dim breaker = 0
End Sub

End Class

이것은 출력의 일부입니다.

 [Menu] [AHU]
List of participants to the certification programme for  Air Handling Units (AHU)  :
A.T.C Air Trade Centre Havaland?rma Sistemleri San. ve Tic. Ltd. ?ti. [ATC]
ACS KLIMA Imalat Sanayi ve Ticaret Ltd. Sti [ACS]
AERA Iklimlendirme Teknolojileri San. ve Tic AS [AERA]
AIRCALO [AIRCALO]
AIRLAN INDUSTRIAL S.A. [AIRLAN]
Airtechnic Hatzoudis E.P.E. [AIRTECHNIC]
AL SALEM YORK Manufacturing Co,Ltd [YORK]
AL-KO THERM GmbH [ALKO]
ALARKO CARRIER San. Tic. A.S. [ALARKO] [CARRIER]

나는별로 익숙하지 않은 listview를 많이 사용하지 않았고 가변 길이의 컬럼을 가지고 있기 때문에 이러한 결과를 어딘가에 임시 저장 한 다음 몇개의 컬럼을 확인해야 할 것인가를 확인한다. 그런 다음 결과를 listview에 덤프하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.