HTML 민첩성 팩 노드 선택

c# html-agility-pack html-parsing

문제

사이트에서 일부 데이터를 긁어 내기 위해 HTML 민첩성 팩을 사용하려고합니다. foreach 내부에서 select 노드를 사용하고 목록 또는 배열로 데이터를 내보내는 방법을 알아 내려고 정말 고심하고 있습니다.

지금까지 작업하고있는 코드는 다음과 같습니다.

       string result = string.Empty;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://www.amazon.com/gp/offer-listing/B002UYSHMM/);
        request.Method = "GET";

        using (var stream = request.GetResponse().GetResponseStream())
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            result = reader.ReadToEnd();
        }

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(new StringReader(result));
        HtmlNode root = doc.DocumentNode;

        string itemdesc = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']").InnerText;  //this works perfectly to get the title of the item
        //HtmlNodeCollection sellers = doc.DocumentNode.SelectNodes("//id['bucketnew']/div/table/tbody/tr/td/ul/a/img/@alt");//this does not work at all in getting the alt attribute from the seller images
        HtmlNodeCollection prices = doc.DocumentNode.SelectNodes("//span[@class='price']"); //this works fine getting the prices
        HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='resultsset']/table/tbody[@class='result']/tr"); //this is the code I am working on to try to collect each tr in the result.  I then want to eather add each span.price to a list from this and also add each alt attribute from the seller image to a list.  Once I get this working I will want to use an if statement in the case that there is text for the seller name instead of an image.

        List<string> sellers = new List<string>();
        List<string> prices = new List<string>();

        foreach (HtmlNode node in nodes)
        {
            HtmlNode seller = node.SelectSingleNode(".//img/@alt");  // I am not sure if this works
            sellers.Add(seller.SelectSingleNode("img").Attributes["alt"]); //this definitly does not work and will not compile.

        }

위의 코드에서 작동하는 것과 그렇지 않은 것을 보여주고 내가 수행하고자하는 것을 정렬하는 주석이 있습니다.

누구든지 어떤 sugguestions이나 독서가 있다면 좋을 것입니다! 나는 포럼과 예제를 찾고 있었고 내가 사용할 수있는 모든 것을 건너 가지 않았다.

수락 된 답변

'id'는 요소 이름이 아니기 때문에 주석 처리 된 SelectNodes 의 첫 번째 문제는 작동하지 않습니다. 속성 이름입니다. 속성을 선택하고 값을 비교하기 위해 다른 표현식에서 올바른 구문을 사용했습니다. 예 : //ElementName[@attributeName='value'] . 나는 심지어 [attributeName='value'] 작동한다고 생각하지만, 이것을 테스트하지는 않았다.

SelectNodes 함수의 구문을 "XPath"라고합니다. 이 링크 는 도움이 될 것입니다.

선택한 seller 노드는 alt 속성이있는 img 인 현재 반복에 대한 node 의 형제 node 입니다. 그러나 당신이 원하는 올바른 구문은 단지 img[@alt] 라고 생각합니다.

컴파일 할 수 없다고 말하는 다음 문제, 오류 메시지를 확인하십시오. 아마도 인수 유형을 다시 불평 할 것입니다. sellers.Add 내 생각에 또 다른 HtmlNode라는 애트리뷰트가 아니라, 애트리뷰트가 추가 내부의 표현식이 리턴하는 것입니다.

또한 Html Agility 팩 문서 및 구문에 관한 기타 질문을 확인하십시오.




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