Html 민첩성 팩 - 문제 선택 서브 노드

asp.net-mvc c# html-agility-pack

문제

내 Asics 실행 계획을 iCal로 내보내고 Asics가이 서비스를 제공하지 않기 때문에 개인적인 용도로 약간의 스크레이퍼를 만들기로 결정했습니다. 내가 원하는 것은 내 계획에서 예정된 모든 실행을 가져 와서이를 기반으로 iCal 피드를 생성하는 것입니다. 나는 C #과 Html Agility Pack을 사용하고있다.

내가하고 싶은 일은 스케줄 된 모든 실행 (div 노드)을 반복하는 것입니다. 다음으로는 실행 노드가있는 몇 가지 다른 노드를 선택하려고합니다. 내 코드는 다음과 같습니다.

foreach (var run in doc.DocumentNode.SelectSingleNode("//div[@id='scheduleTable']").SelectNodes("//div[@class='pTdBox']"))
{
    number++;
    string date = run.SelectSingleNode("//div[@class='date']").InnerText;
    string type = run.SelectSingleNode("//span[@class='menu']").InnerHtml;
    string distance = run.SelectSingleNode("//span[@class='distance']").InnerHtml;
    string description = run.SelectSingleNode("//div[@class='description']").InnerHtml;
    ViewData["result"] += "Dato: " + date + "<br />";
    ViewData["result"] += "Tyep: " + type + "<br />";
    ViewData["result"] += "Distance: " + distance + "<br />";
    ViewData["result"] += "Description: " + description + "<br />";
    ViewData["result"] += run.InnerHtml.Replace("<", "&lt;").Replace(">", "&gt;") + "<br />" + "<br />" + "<br />";
}

내 문제는 run.SelectSingleNode("//div[@class='date']").InnerText 주어진 노드에서 주어진 XPath 가진 노드를 선택하지 않습니다. 전체 문서에서 XPath와 일치하는 첫 번째 노드를 선택합니다.

현재 노드 내에서 주어진 XPath로 단일 노드를 선택하려면 어떻게해야합니까?

고맙습니다.

최신 정보

내 XPath 문자열을 업데이트하려고 :

foreach (var run in doc.DocumentNode.SelectSingleNode("//div[@id='scheduleTable']").SelectNodes("//div[@class='pTdBox']"))
{
    number++;
    string date = run.SelectSingleNode("//div[@class='date']").InnerText;
    string type = run.SelectSingleNode("//span[@class='menu']").InnerHtml;
    string distance = run.SelectSingleNode("//span[@class='distance']").InnerHtml;
    string description = run.SelectSingleNode("//div[@class='description']").InnerHtml;
    ViewData["result"] += "Dato: " + date + "<br />";
    ViewData["result"] += "Tyep: " + type + "<br />";
    ViewData["result"] += "Distance: " + distance + "<br />";
    ViewData["result"] += "Description: " + description + "<br />";
    ViewData["result"] += run.InnerHtml.Replace("<", "&lt;").Replace(">", "&gt;") + "<br />" + "<br />" + "<br />";
}

현재 노드 내에서 <div class="date"></div> 요소를 선택해야합니다. 글쎄,이 시도했지만이 오류가 있어요 :

표현식은 노드 집합으로 평가되어야합니다. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

예외 정보 : System.Xml.XPath.XPathException : Expression은 노드 집합으로 평가되어야합니다.

어떤 제안?

수락 된 답변

HtmlAgilityPackXPath 표현식을 사용하여 작업 할 때 도움이되는 몇 가지 사항이 있습니다.

runHtmlNode 이면 :

  1. run.SelectNodes("//div[@class='date']")
    Will은 doc.DocumentNode.SelectNodes("//div[@class='date']") 와 똑같이 동작합니다.

  2. run.SelectNodes("./div[@class='date']")
    run 노드의 하위 인 모든 <div> 노드를 제공합니다. 바로 다음 깊이 수준에서만 더 깊게 검색하지 않습니다.

  3. run.SelectNodes(".//div[@class='date']")
    해당 클래스 속성을 가진 모든 <div> 노드를 반환하지만 run 노드 옆뿐만 아니라 깊이 검색합니다 (가능한 모든 하위 노드).

어느 것이 당신의 요구를 만족시키는 지에 따라 2. 또는 3. 중에서 선택해야합니다 :)


인기 답변

XPATH에서 // 는 현재 노드 아래의 모든 자식 및 그랜드 자식을 의미합니다. 따라서 더 제한적인 XPATH 표현식을 찾아야합니다. 실제 HTML을 제공하고 정확히 찾고있는 것이 있다면 더 파고 드는 데 도움을 줄 수 있습니다.

보유한 오류 정보 :

.div[@class='date'] 는 유효하지 않습니다 . div 집착합니다. div[@class='date'] 또는 ./div[@class='date'] 하여 동일한 결과를 얻을 수 있습니다. 이 때문입니다 .self 의 별명이고 "현재 노드"를 의미하는 XPATH 도끼 입니다.




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