xpath를 사용하여 다음 형제 / xml 태그를 선택하는 방법


102

Newegg의 HTML 파일이 있으며 HTML은 아래와 같이 구성됩니다. 사양표의 모든 데이터는 ' desc '이고 각 섹션의 제목은 ' name입니다. '아래는 Newegg 페이지의 데이터 두 가지 예입니다.

<tr>
    <td class="name">Brand</td>
    <td class="desc">Intel</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Core i5</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">LGA 1156</td>

<tr>
    <td class="name">Brand</td>
    <td class="desc">AMD</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Phenom II X4</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">Socket AM3</td>
</tr>

결국에는 각 데이터를 저장하기 위해 브랜드, 시리즈, 코어 및 소켓 유형으로 구성된 CPU (이미 설정 됨)에 대한 클래스를 갖고 싶습니다. 이것이 제가 이것을 할 수있는 유일한 방법입니다.

if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
    CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text

나머지 값에 대해서도 이렇게합니다. 다음 형제를 어떻게 달성 할 수 있으며 더 쉬운 방법이 있습니까?

답변:


205

다음 형제를 어떻게 달성 할 수 있으며 더 쉬운 방법이 있습니까?

다음을 사용할 수 있습니다 .

tr/td[@class='name']/following-sibling::td

하지만 차라리 직접 사용하고 싶습니다 .

tr[td[@class='name'] ='Brand']/td[@class='desc']

이것은 다음을 가정합니다 .

  1. XPath 표현식이 평가되는 컨텍스트 노드는 tr질문에 표시되지 않은 모든 요소 의 부모입니다 .

  2. tr요소는 하나 가지고 tdclass값 특성 'name'과 하나 tdclass값 특성 'desc'.


클래스 사용에주의해야합니다. '이름'클래스 요소에 다른 클래스가 동시에 있으면 td[@class='name']중단됩니다. 자세한 내용은 이 질문 을 참조하십시오.
gm2008

@ gm2008, 예, @class 속성 값에 둘 이상의 클래스가있는 경우 사용할 술어는 다음과 같습니다 contains(concat(' ', @class, ' '), ' name ') .. 그러나이 질문에서 @class 속성에는 단일 값만 있습니다.
Dimitre Novatchev 2015-06-15

요소 상대 :./following-sibling::td
존 Gietzen

2
@JohnGietzen, Re : "Relative to an element"- 컨텍스트 노드 가 우리가 관심 을 갖는 요소 인 경우 의미 합니다.이 경우 ./. 또한 바로 다음 형제를 선택하려면 :를 사용하십시오 following-sibling::td[1]. 그렇지 않으면 다음 형제가 둘 이상 있으면 모두 선택됩니다.
Dimitre Novatchev

12

following-sibling축 ( following-sibling::td)을 시도하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.