내부에서 하위 카테고리를 가져올 수 없습니다.
    HtmlAgilityPack C # ASP.NET 사용

asp.net c# html-agility-pack web-scraping

문제

저는 Webscraping에 익숙하지 않고 ASP.NET C #을 사용하여 HTMLAgilityPack으로 웹 사이트에서 데이터를 가져 오려고합니다. 구문 분석하려고하는 HTML 구조는 다음과 같습니다.

<li class='subsubnav' id='new-women-clothing'>
    <span class='cat-name'>CLOTHING</span>

    <ul>
        <li><a href="/womenswear/womens-just-in" id="just-in">Just In</a></li>

        <li><a href="/womenswear/new-season-exclusives" id="exclusives">Exclusives</a></li>

        <li><a href="/womenswear/new-season-dresses" id="dresses-&-gowns">Dresses & Gowns</a></li>

        <li><a href="/womenswear/new-season-coats" id="coats">Coats</a></li>

        <li><a href="/womenswear/new-season-jackets" id="jackets">Jackets</a></li>

        <li><a href="/womenswear/new-season-shirts-and-blouses" id="shirts-&-blouses">Shirts & Blouses</a></li>

        <li><a href="/womenswear/new-season-tops" id="tops">Tops</a></li>

        <li><a href="/womenswear/new-season-knitwear" id="knitwear">Knitwear</a></li>

        <li><a href="/womenswear/new-season-sweatshirts" id="sweatshirts">Sweatshirts</a></li>

        <li><a href="/womenswear/new-season-skirts-and-shorts" id="skirts-&-shorts">Skirts & Shorts</a></li>

        <li><a href="/womenswear/new-season-trousers" id="trousers">Trousers</a></li>

        <li><a href="/womenswear/new-season-jumpsuits" id="jumpsuits">Jumpsuits</a></li>

        <li><a href="/womenswear/new-season-jeans" id="jeans">Jeans</a></li>

        <li><a href="/womenswear/new-season-swimwear" id="swimwear">Swimwear</a></li>

        <li><a href="/womenswear/new-season-lingerie" id="lingerie">Lingerie</a></li>

        <li><a href="/womenswear/new-season-nightwear" id="nightwear">Nightwear</a></li>

        <li><a href="/womenswear/sportswear" id="sportswear">Sportswear</a></li>

        <li><a href="/womenswear/ski-wear" id="ski-wear">Ski Wear</a></li>

    </ul>

</li>

나는이 경우 완벽하게 옷을 입고 있지만 나는 ul 안에 요소를 얻을 수없는 부모 범주를 얻고있다.

여기에 내 C # 코드입니다 :

var html = new HtmlDocument();
html.LoadHtml(new WebClient().DownloadString("http://www.harrods.com/men/t-shirts?icid=megamenu_MW_clothing_t_shirts"));
var root = html.DocumentNode;
var nodes = root.Descendants();
var totalNodes = nodes.Count();
var dt = root.Descendants().Where(n => n.GetAttributeValue("class", "").Equals("cat-name"));

foreach(var x in dt)
{
    foreach (var element in x.Descendants("ul"))
    {
        child_data.Add(new cat_childs(element.InnerText));
    }

    data.Add(new Categories(x.InnerText,child_data));
}

test.DataSource = data;
test.DataBind();

그렇다면 <ul> 내에 앵커 태그의 링크와 텍스트를 어떻게 얻을 수 있습니까?

수락 된 답변

당신이 반복 기초를하려면 span 가진 class='cat-name' , 다음 목표 ul 받는 관계 span 대신 자손의 형제를 따르고있다. SelectNodes() 를 사용하여 다음과 같은 형제 요소를 현재 span 에서 가져올 수 있습니다.

foreach (var x in dt)
{
    foreach (var element in x.SelectNodes("following-sibling::ul/li/a"))
    {
        child_data.Add(new cat_childs(element.InnerText));
    }

    data.Add(new Categories(x.InnerText,child_data));
}

업데이트 :

실제 문제는 바깥 쪽 루프 외부에서 선언 된 child_data 변수에있는 것 같습니다 . 이는 동일한 child_data 인스턴스에 항목을 계속 추가한다는 것을 의미합니다. foreach (var x in dt){ 바로 뒤에 바깥 쪽 루프 안에 선언하십시오. 또는 전체 코드를 다음과 같이 LINQ 식으로 작성할 수 있습니다.

var data = (from d in dt
            let child_data = x.SelectNodes("following-sibling::ul/li/a")
                              .Select(o => new cat_childs(o.InnerText))
                              .ToList()
            select new Categories(x.InnerText, child_data)
           ).ToList();

인기 답변

이 xpath 사용. class = 'cat-name'을 가진 <span>을 포함하는 모든 <li>을 얻습니다. 그 다음에는 <li>로 묶인 모든 <a>가 선택됩니다.

//If the span has no influence on what you want you can simply use: 
//HtmlNodeCollection hNC = htmlDoc.DocumentNode.SelectNodes("//ul/li/a");

HtmlNodeCollection hNC = htmlDoc.DocumentNode.SelectNodes("//li/span[@class='cat-name']/parent::*/ul/li");
foreach (HtmlNode h in hNC)
{
    Console.Write(h.InnerText+" ");
    Console.WriteLine(h.GetAttributeValue("href", ""));
}


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