HTML 민첩성 팩 - 항상 첫 번째 요소 세부 정보 가져 오기

c# html-agility-pack

문제

이 URL에서 요소의 세부 정보를 가져 오기 위해 HTML 민첩성 팩을 사용하고 있습니다. 링크

C # (Windows Form Application)에서이 코드를 사용하고 있습니다.

var webGet = new HtmlWeb();
    doc = webGet.Load("http://www.trendyol.com/Butik/Liste/Kadin");

    HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");
    richTextBox1.Text = butiks.Count().ToString();

    if (butiks != null)
    {
        foreach (HtmlNode element in butiks)
        {
            var butikUrl = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("href", null);
            var butikTitle = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("title", null);
            var butikImg = element.SelectSingleNode("//div[@class='butik-large-image']//a/img").GetAttributeValue("src", null);
            var butikEndTime = element.SelectSingleNode("//div[@class='butik-name']/div[@class='butikTimeLine']/a/div[@class='timelineMain']/h1").GetAttributeValue("enddate", null);
            dataGridView1.Rows.Add("", butikUrl, butikTitle, butikImg, butikEndTime);
        }

    }
    else
    {
        MessageBox.Show("Null Obeject...!");
    }

이 코드는 항상 요소 세부 정보를 반환합니다. 도울 수 있니?

또한 다음 코드를 사용했지만 다음 오류가 발생합니다.

var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);
                        var butikTitle = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("title", null);
                        var butikImg = element.SelectSingleNode(".//div[@class='butik-large-image']//a/img").GetAttributeValue("src", null);
                        var butikEndTime = element.SelectSingleNode(".//div[@class='butik-name']/div[@class='butikTimeLine']/a/div[@class='timelineMain']/h1").GetAttributeValue("enddate", null);

이 오류는 var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

오류 : 추가 정보 : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

수락 된 답변

butiks 변수를 채우는 XPath 술어는 너무 일반적입니다. contains(@class,'butik') 표현식은 foreach 루프 본문에 액세스하려는 특정 하위 항목이없는 butik-name butik-large-image , butik-name 등과도 일치합니다. 예외. 예를 들어 class 정확히 'butik large' (Firefox의 FirePath에서 XPath가 테스트 됨) 인 div 를 검색하여보다 구체적인 조건자를 사용하십시오.

doc.DocumentNode.SelectNodes("//div[@class='butik large']");

인기 답변

변화

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik-large-image')]");

그러면 20 개의 누적 된 광고 요소가 반환됩니다.

그런 다음 다른 광고의 NodeCollection

HtmlNodeCollection butiks2 = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik small left')]");

집에서 HtmlAgilityPack 웹 스크래핑 코드를 사용하여 도움이 될만한 방식으로 촬영할 수 있습니다.

편집 : LINQ 함께 두 목록에 가입 할 수 있습니다.

butiks.Union(butiks2);


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