2012-10-08 7 views
3

html 파일의 노드에서 텍스트를 추출해야하며 XPath 및 Javascript를 사용하려고합니다.dom에 xpath가있는 단어가 포함 된 텍스트 노드 찾기

필수 조건은 텍스트에 특정 단어가 있어야한다는 것입니다.

<html> 
    <body> 
     <p> 
      Hi, try to extract the word username here and here <b>username</b> 
     </p> 
    </body> 
</html> 

그리고이 표현과 단어 '이름'을 포함하는 텍스트 노드에서 텍스트를 얻을려고 :

의 예에 의해 다음 HTML 파일을 보자 검색을 통해

var search = document.evaluate('//*[contains(child::text(), \"username\")]/child::text()', document, null, XPathResult.ANY_TYPE, null); 

순회 I 원하는 결과는 있지만 원치 않는 객체도 있습니다.

["Hi, try to extract the word username here and here", Text, "username"] 

여기서 Text는 Object입니다. 그의 textContent는 캐리지 리턴 기호 (Chrome 콘솔 사용)입니다. 이 객체는 어디서 오는 것입니까?

누구든지 해당 객체를 제외하는 더 정확한 XPath 표현식을 제공 할 수 있습니까? 아니면 내 코드에서 제외시켜야합니까?

이상적인 검색은 다음과 같아야합니다

["Hi, try to extract the word username here and here", "username"] 

감사합니다 여러분!

답변

4

var search = document.evaluate('//text()[contains(., \"username\")]', 
    document, null, XPathResult.ANY_TYPE, null); 

을 원하는 것 같은데 (난 당신이 따옴표 안에 당신의 따옴표를 탈출하는 이유를 모르겠어요,하지만 그건 별개의 문제입니다.)

기존 코드,

var search = document.evaluate('//*[contains(child::text(), \"username\")]/ 
     child::text()', document, null, XPathResult.ANY_TYPE, null); 

는 말한다

  • (1) "username"이 포함 된 텍스트 노드 하위가있는 모든 요소를 ​​찾습니다.
  • (2) 이제 모두 (해당 요소에 관계없이) 해당 요소의 텍스트 노드 하위를 반환하십시오.

식의 (1) 부분은 요소 노드 <p><b>을 반환합니다. (2)와 단계에 대한

, <b>는 하나의 텍스트 노드의 아이를 가지고 있지만 <p> 두 가지가 있습니다와 (공백 만 포함)을 <b> 후 하나 ("이름"을 포함)을 <b> 전에 하나.

해결 방법 : 요소를 잊어 버려서 관련성을 잃었습니다. 원하는 텍스트 노드를 직접 선택하기 만하면됩니다.

+0

고맙습니다. 질문을 한 직후 나는 빛을 보았고 당신이 올린 것과 같은 해결책을 발견했지만 왜 (2)가 일어 났는지 설명 할 수 없었다. 이제 할 수 있습니다;) 간단한 따옴표 안에서 이스케이프 처리 된 큰 따옴표는 내 실수입니다. 팁이 필요하지 않습니다! – dysfuntcional

관련 문제