내가 다 잡아 HTML 민첩성을 사용할 수있는 방법을 <b>사이 <br></b>

c# html-agility-pack html-parsing screen-scraping

문제

나는 지난 주에이 같은 프로젝트에 대해 가난하게 물었고 어떤 제안도받지 못했다. 나는 더 명확하게하려고 노력할 것이다. www.gtin13.com 웹 사이트의 데이터로 작업하고 있습니다. 예를 들어, 검색에 땅콩 버터를 입력하면 설명 을 잡으려고합니다 . ** Nabisco 누터 버터 샌드위치 쿠키 초콜릿 땅콩 버터 4 Ct * 크기 : 크기 : 12 온스 GTIN : 0044000003562 * ean : ** 00- 44000-00356-2 upc : 044000003562 및 upca : 04400000356. SelectNodes ("<b>") 사용하여 nodeCollection을 사용해 보았는데 오류가 발생했습니다. html 민첩성을 사용하여 <b> <br> 사이의 데이터를 잡아서 / s 사이를 파싱하는 것이 가능합니까? 경험이 부족하여이 문제를 해결할 수 없습니다. 반환 된 페이지에 내가 진정한 노드라고 생각하는 것이 나타나지 않습니다. html 민첩성이이를 수행 할 수 없다면 누구나 더 나은 접근 방식을 제안 할 수 있습니까? 결국 나는 각 데이터 조각을 SQL 테이블로 보내고 싶다. 내가 더 잘 이해할 수있는 방법으로 발표했으면 좋겠다.

이 페이지는이 소스 형식의 정보를 반환합니다.

<b><a href="/product/nabisco+nutter+butter+sandwich+cookies+chocolate+peanut+butter+4+ct/">Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct</a></b><br />

Size: 12 oz<br />

GTIN/EAN-13: 0044000003562 / 00-44000-00356-2<br />

UPC-A: 044000003562 / 04400000356<br />



Tags:

<a href="/tag/chocolate/">Chocolate</a>, 

<a href="/tag/cookies/">Cookies</a>, 
 ..<br />

<br >

수락 된 답변

원본 문서가 매우 체계적이지 않기 때문에 (계층 레이아웃은 아니지만 평면 레이아웃을 사용하기 때문에) 간단하지만 Html Agility Pack을 사용하여 주요 텍스트 필드를 추출하는 방법은 다음과 같습니다.

        HtmlDocument doc = new HtmlDocument();
        doc.Load("yourDoc.Htm");

        // Get A nodes that have an HREF attribute
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//b/a[@href]"))
        {
            // This will contain anchor's displayed text
            string title = node.InnerText;
            Console.WriteLine("title=" + title);

            // Get the 1st BR, and then it's next sibling of TEXT type.
            HtmlNode sizeNode = node.SelectSingleNode("../following-sibling::br[1]/following-sibling::text()");
            Console.WriteLine(" size=" + sizeNode.InnerText.Trim());

            // Get the 3nd BR, and then it's next sibling of TEXT type.
            HtmlNode eanNode = node.SelectSingleNode("../following-sibling::br[2]/following-sibling::text()");
            Console.WriteLine(" ean=" + eanNode.InnerText.Trim());

            // Get the 3rd BR, and then it's next sibling of TEXT type.
            HtmlNode upcNode = node.SelectSingleNode("../following-sibling::br[3]/following-sibling::text()");
            Console.WriteLine(" upc=" + upcNode.InnerText.Trim());
        }

그러면 다음과 같이 표시됩니다.

        HtmlDocument doc = new HtmlDocument();
        doc.Load("yourDoc.Htm");

        // Get A nodes that have an HREF attribute
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//b/a[@href]"))
        {
            // This will contain anchor's displayed text
            string title = node.InnerText;
            Console.WriteLine("title=" + title);

            // Get the 1st BR, and then it's next sibling of TEXT type.
            HtmlNode sizeNode = node.SelectSingleNode("../following-sibling::br[1]/following-sibling::text()");
            Console.WriteLine(" size=" + sizeNode.InnerText.Trim());

            // Get the 3nd BR, and then it's next sibling of TEXT type.
            HtmlNode eanNode = node.SelectSingleNode("../following-sibling::br[2]/following-sibling::text()");
            Console.WriteLine(" ean=" + eanNode.InnerText.Trim());

            // Get the 3rd BR, and then it's next sibling of TEXT type.
            HtmlNode upcNode = node.SelectSingleNode("../following-sibling::br[3]/following-sibling::text()");
            Console.WriteLine(" upc=" + upcNode.InnerText.Trim());
        }

기타...

참고 : 그것은 표준 문자열 조작 (IndexOf, 하위 문자열, 등 ...) 또는 정규식을 사용하여 크기, ean 및 upc 변수를 구문 분석해야하므로 100 % 완료되지 않습니다. 그러나 HTML 측면의 작업이 수행됩니다.


인기 답변

HTQL을 사용하면 페이지에서 전체 테이블을 추출하는 쿼리는 다음과 같습니다.

<div (CLASS='BGC')>1.<div (CLASS='CON')>1.<div (CLASS='SC')>1.<div (ID='post-20')>1.<div (CLASS='PostContent')>1.<b sep>2-0 {
  title=<a>1:tx; 
  size=/'Size:'~'<br />'/;
  gtin=/'GTIN/EAN-13:'~'<br />'/;
  upc=/'UPC-A:'~'<br />'/;
  tags=/'Tags:'~'<br />'/;
}

SQL 데이터베이스에 결과 만 보내야하는 경우 IRobotSoft 웹 스크레이퍼를 사용하여 sugguest합니다.




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