2013-07-18 6 views
0

사이트 중 하나에 대한 크롤러를 작성 중이며이 문제가 발생했습니다. 이 HTML에서 XPath로 어떻게 얻을 수 있습니까?

...

<div class="Price"> 
    <span style="font-size: 14px; text-decoration: line-through; color: #444;">195.90 USD</span> 
    <br /> 
    131.90 USD   
</div> 

나는 XPath를 사용하는 경우에만 131.90 USD 얻을 필요가있다. 이 시도

...

"//div[@class='Price']" 

그러나 다른 결과를 반환합니다.

어떻게하면됩니까?

편집

난 당신이 시도는 XPath가있다

public static class Helper { 
    public static String GetInnerText(HtmlDocument doc, String xpath) { 
     var nodes = doc.DocumentNode.SelectNodes(xpath); 
     if (nodes != null && nodes.Count > 0) { 
      var node = nodes[0]; 
      return node.InnerText.TrimHtml(); 
     } 
     return String.Empty; 
    } 

    public static String GetInnerText(HtmlNode inputNode, String xpath) { 
     var nodes = inputNode.SelectNodes(xpath); 
     if (nodes != null && nodes.Count > 0) { 
      var node = nodes[0]; 
      var comments = node.ChildNodes.OfType<HtmlCommentNode>().ToList(); 
      foreach (var comment in comments) 
       comment.ParentNode.RemoveChild(comment); 

      return node.InnerText.TrimHtml(); 
     } 
     return String.Empty; 
    } 

    public static String GetInnerHtml(HtmlDocument doc, String xpath) { 
     var nodes = doc.DocumentNode.SelectNodes(xpath); 
     if (nodes != null && nodes.Count > 0) { 
      var node = nodes[0]; 
      return node.InnerHtml.TrimHtml(); 
     } 
     return String.Empty; 
    } 

    public static string GetInnerHtml(HtmlNode inputNode, string xpath) { 
     var nodes = inputNode.SelectNodes(xpath); 
     if (nodes != null && nodes.Count > 0) { 
      var node = nodes[0]; 
      return node.InnerHtml.TrimHtml(); 
     } 
     return string.Empty; 
    } 
} 
+0

장소? HtmlAgilityPack? LINQ2XML? – Arran

+0

HtmlAgilityPack. – Zafar

+0

현재 어떤 코드를 사용하고 있습니까? – Arran

답변

1

(데모 간체)이 C# 코드

protected override DealDictionary GrabData(HtmlAgilityPack.HtmlDocument html) { 
var price = Helper.GetInnerHtml(html.DocumentNode, "//div[@class='Price']/text()"); 

}

도우미 클래스를 사용하고 있습니다 좋은 시작 :

//div[@class='Price'] 

이렇게하면 XML 문서에서 <div> 요소를 선택합니다. 값이 Priceclass 특성을 갖는 요소를 <div> 요소로 제한합니다.

지금까지는 매우 좋았지 만 <div> 요소를 선택하면 돌아 오는 요소는 모든 내용을 포함하여 <div> 요소가됩니다. 는 XML 조각에서

당신은, 위의 표시하면 다음과 같은 계층 구조가 있습니다

<div> element 
    <span> element 
     text node 
    <br> element 
    text node 

그래서, 당신이 실제로 관심이 무엇인지 후자의 텍스트 노드입니다. XPath에서 text()을 사용하여 텍스트 노드를 선택할 수 있습니다. 이 경우, 당신은 당신이 발견 <div> 요소의 직계 자식 첫 번째 텍스트 노드에 관심이, 당신의 XPath는 다음과 같아야합니다

처음에 HTML을 잡기 위해 사용하고있는 프레임 워크
//div[@class='Price']/text() 
+0

왜 내가 빈 문자열을 돌려 주나요? 흠 .. – Zafar

+0

@ Zafar : 아직입니까? 필자는 [이 온라인 XPath 테스트 벤치] (http://www.freeformatter.com/xpath-tester.html)에서 테스트를 실시한 결과 'Text ='131.90 USD '라는 결과를 보여줍니다. –

관련 문제