홈>
특정 클래스의 객체를 찾았습니다 :
THREAD = TREE.find_class('thread')[0]
이제 모든
<p>
를 원합니다
직접적인 자식 인 요소.
지쳤다 :
THREAD.findall("p")
THREAD.xpath("//div[@class='thread']/p")
그러나 그 모든 것은 모든
<p>
를 반환합니다.
이
<div>
내부 요소
그
<div>
에 상관없이
그들의 가장 가까운 부모입니다.
어떻게 작동 시키나요?
수정 :
샘플 HTML :
<div class='thread'>
<p> <!-- 1 -->
<!-- Can be some others <p> objects inside, which should not be counted -->
</p>
<p><!-- 2 --></p>
</div>
<div class='thread'>
<p>[...]</p>
<p>[...]</p>
</div>
스크립트는 두 개의 객체를 찾아야합니다.
<p>
의 자녀 인
. 샘플 HTML의 주석에서 "1"과 "2"로 표시된 두 개체의 목록을 받아야합니다.
편집 2 :
사람들이 혼동하기 때문에 또 다른 설명이 있습니다 :
THREAD
변수에 저장된 일부 객체이며 모든 html 요소가 될 수 있습니다.
THREAD
를 찾고 싶습니다
<p>
의 직계 자손 인 물건
. 그
THREAD
<p>
밖에있을 수 없습니다
또는
THREAD
내부에있는 모든 요소 내부
.
THREAD
- 답변 # 1
- 답변 # 2
이 XPath 표현식을 사용해보십시오 :
//p[parent::div[@class='thread']]
또는 완전한 파이썬 표현 :
THREAD.xpath("//p[parent::div[@class='thread']]")
다른 (역) 접근법은이 XPath 표현식입니다 :
직접div[@class='thread']/child::p"
child::
를 사용하는축과 직접 하위 노드 만 선택합니다.
요약 :
<시간>
두 표현식 중 어느 것이 더 빠른지 XPath 컴파일러에 따라 다릅니다. 와이즈 비즈 기본 축이며 다른 축이 지정되지 않은 경우 사용됩니다.FYI : XPath 계산은1에서 시작하며0이 아님.
XML 예제와 관련하여 다음 표현식child::
2의 결과가 되었음-
count(//div[@class='thread'][1]/child::p)
계산 결과 + 와이즈 비즈 . - 답변 # 3
PARENT.getchildren ()
<p> <!-- 1 -->
<p><!-- 2 --></p>
잘 모르겠지만 문제가 HTML 자체 인 것 같습니다.
p
에 적용 할 수있는 태그 생략 사례가 몇 가지 있습니다. 노드, 따라서 단락 태그 닫기구문 파서에 의해 단순히 무시되고 형제로 식별되었지만 부모와 자식이 아닌 두 노드 모두 예 :
그래서 XPath
//div[@class="thread"]/p
두 단락을 모두 반환합니다p
를 간단히 대체 할 수 있습니다div
태그 태그와 다른 동작을 볼 수 있습니다 :여기
//div[@class="thread"]/div
첫 번째 노드 만 반환합니다.내 가정이 틀렸다면 저를 정정하십시오