2013-05-24 2 views
3

2 개의 다른 테이블에 동일한 td의 2 개의 occourances가 있습니다.xpath를 사용하여 html로 두 번째 td를 찾는 방법

나는이를 사용하여 1 하나의 값 '예'를 얻을 수 있어요 :

//h:td[1][*[contains(.,'Loudspeaker')]]/../h:td[last()]/text() 

하지만 2 하나의 값 '음성 75dB/소음 66dB/링 75dB'을 얻고 있지. 나는 시도 :

//h:td[2][*[contains(.,'Loudspeaker')]]/../h:td[last()]/text() 

나는 HTML과 XPath는 그렇게 나와 함께 곰하시기 바랍니다 매우 새로운 오전. 내 HTML의

부분 :

</table><table cellspacing="0"> 
<tr> 
<th rowspan="3" scope="row">Sound</th> 
<td class="ttl"><a href="glossary.php3?term=call-alerts">Alert types</a></td> 
<td class="nfo">Vibration; MP3, WAV ringtones</td> 
    </tr> 

<tr> 
<td class="ttl"><a href="glossary.php3?term=loudspeaker">Loudspeaker</a> </td> 
<td class="nfo">Yes</td> 
</tr> 

. .

<table cellspacing="0"> 
<tr> 
<th rowspan="5" scope="row">Tests</th> 
<td class="ttl"><a href="xyz.php">Display</a></td> 
<td class="nfo"> 
<a class="noUnd" href="http://xyz.php">Contrast ratio: Infinite (nominal)/3.419:1  (sunlight)</a></td> 
</tr><tr> 

<td class="ttl"><a href="xyz.php">Loudspeaker</a></td> 
<td class="nfo"> 
<a class="noUnd" href="http://xyz.php">Voice 75dB/Noise 66dB/Ring 75dB</a></td> 
</tr><tr> 

.. 미리

감사합니다.

+0

당신이 모든 일을 게시하시기 바랍니다 수 있습니까? 둘 다 td를 포함하는 공통 상위 블록을 사용하여 샘플 html을 다시 만들 필요가 없습니다. –

+0

html 페이지는 약 800 줄입니다. 그러나이 웹 사이트 페이지에서 html을 얻을 수 있습니다. 이것으로 충분하길 바란다. (http://www.gsmarena.com/samsung_galaxy_s_duos_s7562-4883.php) – MSR13

답변

2

두 가지 코드의 유일한 차이점은 두 번째 코드에서 텍스트가 a 요소 내에 중첩되어 있다는 점입니다. 그래서이어야한다

//h:td[2][*[contains(.,'Loudspeaker')]]/../h:td[last()]/h:a/text() 

(나는 당신이 당신의 XPath에서 사용 당신이 h에 대한 네임 스페이스 정의가 생각

+0

당신은 네임 스페이스 정의에 대해 맞춰 보았다. 나는 이것을 보았지만 행운이 없었다. 감사!!! – MSR13

+0

dirkk- 나는 이것을 시도하고 효과가 있었다. (/ h : a/text())// h : td [last()]/h : td [1] [* (포함하는 (., '라우드 스피커')]]. 코드에서 2를 1로 변경했습니다. 하지만 어떻게 작동하는지 이해하지 못했습니까? – MSR13

+0

이것은 데이터에 따라 다르며 사용자는이를 보여주지 않았으므로 쿼리에서 사용한 것처럼 2를 사용했습니다. 차이점은'td [1]'은 첫 번째'td' 요소를 선택하고'td [2] '는 두 번째 요소를 선택한다는 것입니다. XML 노드가 정렬 될 때 노드 요소의 위치를 ​​기반으로하는 조건입니다. – dirkk

1

당신이하고있는 것은 :.

//h:td[2] 각 두 번째 TD에서 찾을 전체 문서 (여기에서 주요 문제는 텍스트가 "스피커"라는 텍스트가 없기 때문입니다.)
[*[contains(.,'Loudspeaker')]] 어린이 (어린이)의 경우이 (두 번째 td)에 텍스트가있는 확성기가 있는지 확인하십시오.
/../h:td[last()]/text()은 부모로부터 마지막 ​​td의 텍스트를 얻습니다.

은 그러나 당신이 좋아 보이는 것은 같은 것입니다 :
(//h:tr[h:td/*[contains(.,'Loudspeaker')]]) 찾을 모든 TR 텍스트 "스피커" [2]이 TRS의 두 번째 선택이있다.
/h:td[last()]/.이 두 번째 마지막 td의 자녀가있는 텍스트는 tr입니다.

(테스트하지!) 시도 그 때문에 :

(//h:tr[h:td/*[contains(.,'Loudspeaker')]])[2]/h:td[last()]/. 
+0

시도했지만 행운이 없습니다. 감사. 위의 주석에서 언급했듯이 (// h : td [1] [* [contains (.], [확성기])]] /../ h : td [last()]/h : a/text())가 작동했습니다. – MSR13

관련 문제