2016-09-28 2 views
0

이 웹 사이트에서 내용을 추출하고 싶습니다. https://it.projektwerk.com/de/projects/javax.xml.xpath에 대한 XPath 표현이 작동하지 않습니다.

내가 XPath 식을 가지고 : .//*[@id='content_0']/H3/A 이 -

이 유효한 XPath 식입니다 (대문자 내 문서 파서로, 정확합니다> org.cyberneko.html ... 그 대문자 사람에 태그를 구문 분석) ; FirePath를 사용하여 콘텐츠를 가져올 수 있습니다. 그러나 javax.xml.xpath 클래스를 사용하면 검색이 불가능합니다. 나는 이런 식으로 일을 해요 :

XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expr = xpath.compile(exprString); 
Node node = expr.evaluate(doc, XPathConstants.NODE); 

하지만 node 항상 null입니다. 그

희망 누군가가 도움이 될 수 있습니다 (예를 들어, .//*[@id='p_p_id']/DIV/DIV/DIV/DIV[3]/A/H3/SPAN)가 작동 중이 동일한 구문의 다른 표현으로 다른 웹 사이트가있는 한

나는이 작업을하지 않습니다.

+1

일반적으로 HTML 요소는 HTML 네임 스페이스, 즉 URI가 http : // www.w3.org/ 1999/xhtml 인 네임 스페이스에 있습니다. [xpath.setNamespaceContext]를 호출해야합니다 (http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPath.html#setNamespaceContext-javax.xml.namespace.NamespaceContext-) 네임 스페이스를 XPath 엔진에 알리려면 표현식을'.//*[@ id = 'content_0']/html : H3/html : A'와 같이 변경하십시오. – VGR

+0

VGR 덕분에 해결책을 찾는데 도움이되었습니다. 자세한 내용은 내 대답을 참조하십시오. – eSKape

답변

0

VGR 덕분에 문제를 알 수있었습니다.

내가 HtmlCleaner을 사용하고로서, 나는 다음과 같은 코드를 사용 : 웹 사이트는, 그 XPath 표현식이 작동되지 않은 경우, 다음과 같이 구축 된 HTML 태그와 이름 공간을 인식하는 웹 사이트이었다

HtmlCleaner cleaner = new HtmlCleaner(); 
CleanerProperties props = cleaner.getProperties(); 
props.setNamespacesAware(false); 
TagNode mainNode = cleaner.clean(htmlString); 

을하는해야 , 설명서에 따라 HTML 문서에서 네임 스페이스 특성을 제거합니다. 그러나 이것은 이 아니라 일을합니다! 놀랍게도, 테스트 된 html 문서의 html 태그 안에있는 xmlns 속성은 속성 목록 내부의 위치 만 변경합니다.

이 제거
public TagNode removeNamespaceFromHtmlTag(TagNode htmlNode) { 
    htmlNode.removeAttribute("xmlns"); 
    return htmlNode; 
} 

이 질문에 정의 된 XPath 식 원하는 결과를 반환합니다 그래서이 솔루션은 수동의 xmlns는 HTML 노드의 HtmlCleaner의 TagNode 표현을 사용하여 htmlTag에서 속성을 제거하는 것이었다.

관련 문제