2017-11-23 16 views
0

에서 검색 사용에 HtmlNode을 얻을하고 그래서 여기에 내가 뭐하는 거지 예외를 나에게 Expression must evaluate to a node-set.'내가 그것을 얻을 경우 자산 <code>XPath</code>은 <code>HtmlNode</code>의이 XPath는이 같은 HtmlNode

을 제공 루트 HtmlNode에서 단일 노드를 얻기 위해 그것을 사용할 수 없습니다 :

HtmlNode someNode=getNode(rootNode); 
HtmlNode foundNode=rootNode.SelectSingleNode(someNode.XPath); 

호출 중에 구조가 변경되지 않습니다. 왜 그것이 작동하지 않는 단서? 나는 을 다음과 같이 얻는다 : /html[1]/body[1]/main[1]/div[1]/div[1]/div[2]/form[1]/div[2]/#text[1]

+0

우리는 코드의 나머지 볼 수 -) (특히 메소드는 getNode를; 또한 바람직하게는 귀하가 긁어 모으려고하는 사이트의 URL을 입력하십시오. –

+0

나는 그것이 중요하다고 생각하지 않는다. 내 질문은, 왜 내가 그것의 부모로부터 그것을 얻으려면 속성의'XPath'를 사용할 수 없다는 것입니다. 하지만 도움이된다면. [link] (https://acerrecertified.com/acer-34-widescreen-lcd-monitor-display-uw-qhd-3440-x-1440-4-ms-ips-x34-bmiphz-scratch-dent)입니다.). 나는 그저 모든 텍스트를 포함하는 노드를 얻는다. – Javidan

+0

그리고 나는 "재고가 없다"라는 문구를 찾았습니다. 내가 말했듯이, 실제 노드에서이 XPath를 사용할 수없는 또 다른 예를 들어서 루트 노드에서 가져올 수 있습니다. – Javidan

답변

1

나는 그것이 중요하다고 생각한다. 귀하의 xpath 중 첫 번째가 혼란스럽고 유지 보수하기가 어렵 기 때문에 사이트에서 작은 것을 하나만 변경하면됩니다. 아래의 방법은 당신이하려는 일을하는 올바른 방법입니다.

HtmlNode n = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/main[1]/div[1]/div[1]/div[2]/form[1]/div[2]/text()[1]"); 

Console.WriteLine(n.InnerText); 

더 쉬운 방법은 다음과 같습니다.

HtmlNode n = doc.DocumentNode.SelectSingleNode("//div[@class='alert alert-error'][string-length(normalize-space(text()))>0]"); 

여기서 'alert alert-error'와 같은 class 속성을 사용하여 div 태그를 선택합니다. 그러나 길이가 0보다 큰 경우에만 필요합니다.

+0

것은 속성에 의해 반환되므로,'SelectSingleNode()'에 보낼 수 있다고 생각했습니다. 그렇다면'#'을 제거하고'() '를 끝에 추가하는 것입니까? – Javidan

+0

그리고 예제 링크를 제공하고 싶지 않은 이유는 텍스트를 검색하고, 노드를 찾고, 해당 노드의 XPath를 가져 와서 스니핑에 사용하는 일반적인 솔루션을 구현하고 싶습니다. 그래서 내가 그것을 하드 코딩 할 수없는 이유입니다. – Javidan

+0

마지막 부분에만 문제가있는 것처럼 보입니다. 원하는 부분이 아닌 것 같습니다. 정확한 노드의 이름을 제거 할 수 있습니다. 제 경우에는'# text'이고 부모의 div 요소를 확인하십시오. – Javidan

0

일부 코드를 제공하지 않으면 문제의 원인을 파악하기가 매우 어렵습니다.

당신은 단지 특정 문자열을 찾으려면, 당신이 이런 식으로, xpath functions를 사용하는 것이 좋습니다 것입니다 :

"//*[contains(text(), 'string you are looking for')]" 
+0

'HtmlAgilityPack'은'HtmlNode' 타입을 가지고 있습니다. 이것은'XPath' 속성을 가지고 있습니다. 그리고'XPath' 문자열을 요구하는'SelectSingleNode' 함수가 있습니다. 'HtmlDocument'에서'HtmlNode'의'XPath'를 취하여 root라고 말하면 함수 ('root.DocumentNode.SelectSingleNode()')로 보내면 같은 HtmlNode를 얻을 것이라고 가정합니다. 예외를 준다.나는이 질문을 설명 할 다른 방법을 모른다. 그러나 어쨌든 나는 XPath에서 마지막 아이의 이름을 제거함으로써 문제를 해결했다. – Javidan