2012-05-05 3 views
0

저는 vb.net에 새로 입문했습니다. 저는 제 자신의 사용을 위해 만드는 소프트웨어에 큰 문제가 있습니다.VB.NET 다운로드 html 코드 테이블

1. 배경 :

나는이 .txt 파일로 웹 페이지의 소스 코드를 다운로드하고을 찾고 정보를 걸러 내 소프트웨어 코드가 있습니다. 정상적인 HTML 코드의 경우에는 정상적으로 작동합니다.


2. 문제 : 그들은 너무 막연한이기 때문에 나는 HTML 코드에서 특정 매개 변수를 타겟팅 할 수 없습니다 때

문제입니다.


3. 예 :

나는 고유의 HTML 코드의이 종류를 다운로드하고 코드 만들기의 같은 줄에 있기 때문에 내 소프트웨어에서 문자열에 (이 경우 브라운) 변수를 전달할 수 있습니다 이 독특한 :

<div class="Performer_DataLabel">Hair Color:</div> Brown</div> 

그러나 내가 원하는 특정 테이블을 검색하는 방법을 알고 그 행과 세포 (1 행의 코드를 보여주는 아래의 이와 같은 그리고 내가 관심이있는 2 개 세포) :

1. <tr> 
2.  <td class="paramname"> 
3.   <b>Hair Color:</b> 
4.  </td> 
5.  <td class="paramvalue"> 
6.   Brown&nbsp; 
7.  </td> 
8. </tr> 

"머리 색깔 :"은 "눈 색깔"이나 "높이"와 같은 변수 일 수 있습니다. "갈색"은 그 질문에 대한 답이 될 수 있습니다. 이러한 테이블, 행 또는 셀에는 코드가 한 행에 쓰여질 때와 같이 코드 행을 대상으로하기에 충분한 고유 코드가 없습니다.


4. 내가 원하는 :

(이 경우 브라운)의 대답을 대상으로/위의 예와 검색에서 같은 HTML 코드 테이블에 "헤어 컬러"를 검색 및 대상 할 수 있으려면 인접한 셀에 넣고 String 변수로 전달합니다. (저는 "Hair Color"와 같은 것을 항상 알고있을 것입니다. 그러나 Hair Color 질문에 대한 답을 미리 모를 것입니다. 그리고 그 대답 변수는 내가 찾고자하는 것입니다.).


5. 결론 :

VB.NET 코드는 내가하는 데 사용할 수있는 일 : "머리 색"또는 "아이 같은 단어를 포함

1) 검색/대상 HTML 코드 테이블 색깔".

2) 응답 변수를 검색/대상 지정.

3) 내 소프트웨어의 String에 대한 답변을 전달 (몇 가지 질문은 바로 지금을 비교/예측 가능한 응답의 장거리, 그래서 IF 또는 SELECT CASE 문을 가질 수있는 옵션이 아니다).


6.참고

전체 소스 코드의 줄 수에 관계없이 질문 (머리카락 색)은 항상 테이블 행 (줄 3) 내에서 같은 줄에 있습니다.

또한 답은 항상 테이블 행의 같은 줄 (행 6)에 있습니다.

그러나 질문 행 자체는 항상 테이블의 같은 위치에있는 것은 아닙니다.

+0

HTML의 출처는 어디입니까? 구조가 균일하지 않다고 말하면 - 솔루션을 제공하는 것이 불가능 해집니다. HTML의 데이터는 ** 균일하게 구조화되지 ** 않으며 균일 한 방식으로 데이터를 쿼리 할 수 ​​없습니다. – Oded

+0

빠른 답장을 보내 주셔서 감사합니다. 소스 코드에서 "Hair Color"라는 말을 대상으로 할 수 있습니까? (인수를 위해) 고유 한 경우 해당 대상을 기반으로 항상 세 줄을 뛰어 넘어 그 줄에있는 대상을 찾습니다. – Auhn

+0

HTML 소스에서 해당 문자열을 찾을 수는 있지만 소스를 검사하지 않고 어떤 구조로 유지되는지 알 수있는 방법이 없습니다. 특히 다른 데이터에 직접 액세스 할 수있는 방법을 제공하지는 않습니다. – Oded

답변

1

아마도 HTML agility pack을 사용하고 싶을 것입니다. HTML (유효하지 않은 것)을 구문 분석하는 데 매우 유용합니다. 코드 파일을 다운로드하고 프로젝트 참조를 추가하려면 코드 파일의 처음에 Imports HtmlAgilityPack을 추가해야합니다.

Imports HtmlAgilityPack 
Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Dim document As New HtmlAgilityPack.HtmlDocument, strAnswer As String 
     document.Load("C:\tmp\1.html") 
     For Each td As HtmlAgilityPack.HtmlNode In document.DocumentNode.Descendants("td") 
      If td.InnerText.IndexOf("Hair Color") <> -1 Then 
       strAnswer = next_td(td).InnerText 
       MsgBox(strAnswer) 
       Exit For 
      End If 
     Next 
    End Sub 
    Private Function next_td(td As HtmlNode) As HtmlNode 
     Try 
     If td.NextSibling.Name = "td" Then 
      Return td.NextSibling 
     Else 
      Return next_td(td.NextSibling) 
     End If 
     Catch 
     Throw New Exception("Last <td> in document reached") 
     End Try 
    End Function 
End Class 
+0

방금 ​​HTML 민첩성 팩을 다운로드하여 프로젝트에 대한 참조로 추가했습니다. 코드가 HtmlDocument에 대한 excep를 제공하지 않으며 빌드 할 때 다음 오류가 발생합니다. ** 오류 'HtmlDocument'가 모호합니다. 네임 스페이스 또는 형식 'HtmlAgilityPack, System.Windows.Forms'에서 가져옴 ** – Auhn

+0

아, 내 테스트 프로젝트에서 Windows.Forms를 사용하지 않았습니다. 'Dim document as New HtmlDocument'를'Dim document As New HtmlAgilityPack.HtmlDocument'로 바꾸십시오. –

+0

제 질문에 언급하지 않은 것에 대해 사과드립니다. 당신이 언급 한 내용으로 바꿨고 그 오류를 해결했습니다. 그러나 이제 Visual Studio 2010은 HtmlNode In_ ** 문서 .Descendants ** _ ("td") _에 대해 각각 불만을 토로하고 ** 'Descendants'는 'HtmlAgilityPack.HtmlDocument'**의 멤버가 아닙니다. – Auhn

0

이 업데이트 된 코드이지만, 표적 세포 중 하나가 타겟이되고 있지 않거나 그 내용은 응답 변수에 전달되지 않는 :

Dim document As New HtmlAgilityPack.HtmlDocument, strAnswer As String 
    document.Load("C:\TEST\downloaded.html") 
    For Each td As HtmlAgilityPack.HtmlNode In document.DocumentNode.Descendants("td") 
     If td.InnerText.IndexOf("Hair Color") <> -1 Then 

      strAnswer = td.NextSibling.InnerText 
      MsgBox(strAnswer) 

      Exit For 
     End If 
    Next 
다음은 그 후 문제를 해결하는 코드는

"머리 색깔"이라는 텍스트가이 검색어에서 발견되는 지 확실하지 않습니다. td.InnerText.IndexOf("Hair Color") <> -1 Then 라인을 출력하려고하면 4 값을 받고 문자열 strAnswer에 아무 것도 전달하지 못했지만 아무 것도 출력하지 않는 것으로 보입니다.

완전히 잘못된 것을하고 있습니까?