XPath, HTML의 여러 노드에서 여러 요소 선택

c# html html-agility-pack xpath

문제

나는 단지 이것을 이해할 수 없다.

클래스의 "item extend featured" 값 (아래 코드)이있는 모든 노드를 검색해야합니다. 이 클래스에서는 <h2 class="itemtitle">href 값의 모든 InnerText와 함께 <div class="title-additional"> 모든 InnerText를 선택해야합니다.

<li class="item extend featured">
    <div class="title-box">
        <h2 class="itemtitle">
            <a target="_top" href="www.example.com/example1/example2/exammple4/example4" title="PC Number 1">PC Number 1</a>
        </h2>
        <div class="title-additional">
            <div class="title-km">150 km</div>
            <div class="title-year">2009</div>
            <div class="title-price">250 €</div>
        </div>

출력은 다음과 같아야합니다.

Title:
href:
Title-km:
Title-year:
Title-Price:
--------------


Title:
href:
Title-km:
Title-year:
Title-Price:
--------------

그래서 문제는 html로 모든 "item extend featured" 노드를 통과하고 각 노드에서 위에서 필요한 항목을 선택하는 방법입니다.

내가 아는 바로는 이것과 같은 것이 작동하지만 중간에 중단됩니다.

편집 : 방금 주목 한, 사이트에 동일한 클래스를 공유하는 광고가 있고 그들은 분명히 필요한 요소가 없습니다. 생각할 문제가 많습니다.

var items1 = htmlDoc.DocumentNode.SelectNodes("//*[@class='item extend featured']");

foreach (var e in items1)
{
   var test = e.SelectSingleNode(".//a[@target='_top']").InnerText;
   Console.WriteLine(test);
}

수락 된 답변

var page = new HtmlDocument();
page.Load(path);
var lists = page.DocumentNode.SelectNodes("//li[@class='item extend featured']");
foreach(var list in lists)
{
    var link = list.SelectSingleNode(".//*[@class='itemtitle']/a");
    string title = link.GetAttributeValue("title", string.Empty);
    string href = link.GetAttributeValue("href", string.Empty);
    string km = list.SelectSingleNode(".//*[@class='title-km']").InnerText;
    string year = list.SelectSingleNode(".//*[@class='title-year']").InnerText;
    string price = list.SelectSingleNode(".//*[@class='title-price']").InnerText;
    Console.WriteLine("Title: %s\r\n href: %s\r\n Title-km: %s\r\n Title-year: %s\r\n Title-Price: %s\r\n\r\n", title, href, km, year, price);
}

인기 답변

하나의 쿼리를 사용하여 다른 레벨에서 여러 결과를 반환 할 수 없으므로 여러 XPath 표현식을 사용해야합니다 (Union을 사용하지 않는 한).

당신이 찾고있는 것이 이것과 비슷한 것입니다 :

var listItems = htmlDoc.DocumentNode.SelectNodes("//li[@class='item extend featured']");

foreach(var li in listItems) {
    var title = li.SelectNodes("//h2/a/text()");
    var href = li.SelectNodes("//h2/a/@href");
    var title_km = li.SelectNodes("//div[@class='title-additional']/div[@class='title-km']/text()");
    var title_... // other divs
}

참고 : 테스트되지 않은 코드



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow