在xpath查询中使用not

我从我正在使用XPath的站点获取特定数据但为此我必须排除少量变量 我必须使用NOT。 但是这不是代码中没有用的,请解释我要做些什么来使它工作:</ p>

继承人的HTML代码</ strong> </ p>
\ n

 &lt; tr&gt;&lt; td colspan =“2”valign =“top”align =“left”&gt;&lt; span class =“tl-document”&gt; 
&lt; left&gt; some text 这里
&lt; / left&gt;
&lt; / span&gt;&lt; / td&gt;&lt; / tr&gt;
&lt; tr&gt;&lt; td colspan =“2”valign =“top”align =“left”&gt;
&lt ; span class =“text-id”&gt;这里的一些文字,&lt; sup&gt; a&lt; / sup&gt;&lt; sup&gt; b&lt; / sup&gt;&lt; / span&gt;
&lt; span class =“text-id”&gt ;这里的一些文字,&lt; sup&gt; a&lt; / sup&gt;&lt; / span&gt;
&lt; / td&gt;&lt; / tr&gt;
&lt; tr&gt;&lt; td colspan =“2”valign =“top”class = “右”&gt;
&lt; sup&gt; a&lt; / sup&gt;这里的一些文字&lt; br&gt;
&lt; / td&gt;&lt; / tr&gt;
&lt; tr&gt;&lt; td colspan =“2”valign =“top” class =“right”&gt;
&lt; sup&gt; b&lt; / sup&gt;这里的一些文字&lt; br&gt;
&lt; / td&gt;&lt; / tr&gt;
&lt; td colspan =“2”valign =“top”&gt;

&lt; br&gt;&lt; div&gt;
&lt; span class =“tl-default”&gt;目标&lt; / span&gt;
&lt; p&gt;一些t ext此处,&lt; / p&gt;
&lt; / div&gt;
&lt; div&gt;
&lt; span class =“tl-default”&gt;方法&lt; / span&gt;
&lt; p&gt;这里的一些文字&lt; / p&gt ;
&lt; / div&gt;
&lt; div&gt;
&lt; / td&gt;
&lt; td colspan =“2”valign =“top”&gt;
&lt; br&gt;&lt; div&gt;
&lt; span class =“ tl-default“&gt;目标&lt; / span&gt;
&lt; p&gt;这里有一些文字,&lt; / p&gt;
&lt; / div&gt;
&lt; / td&gt;
</ code> </ pre>
\ n

尝试仅获取不包含类的td并对齐,为此我将此方法用于我的xpath:</ p>

  $ getnew =“http:// www。  example.com/;
$html = new DOMDocument();
@ $ html-&gt; loadHtmlFile($ getnew);
$ xpath = new DOMXPath($ html);
$ y = $ xpath-&gt ; query('// td [@colspan =“2”和valign =“top”和(not(@class and @align))]');
$ ycnt = $ y-&gt; length;
for( $ IDF = 6; $ IDF&LT; $ ycnt; $ idf ++)
{if($ idf == 6){
echo“&lt; p class ='artbox'&gt;”。$ y-&gt; item($ idf) - &gt; nodeValue。“&lt; / p&gt;“;}
}
</ code> </ pre>

我是新手,所以请提出您的意见</ p>
</ div>

展开原文

原文

i am fetching specific data from a site for which i am using XPath but for this i have to exclude few variables for which i have to use NOT. but this NOT is not working in the code please explain what i have to do to make it work :

heres the html code

<tr><td colspan="2" valign="top" align="left"><span class="tl-document">
<left>some text here
</left>
</span></td></tr>
<tr><td colspan="2" valign="top" align="left">
<span class="text-id">some text here,<sup>a</sup><sup>b</sup></span>
<span class="text-id">some text here,<sup>a</sup></span>
</td></tr>
<tr><td colspan="2" valign="top" class="right">
<sup>a</sup>some text here<br>
</td></tr>
<tr><td colspan="2" valign="top" class="right">
<sup>b</sup>some text here<br>
</td></tr>
<td colspan="2" valign="top">
<br><div>
<span class="tl-default">Objective</span>
<p>some text here,</p>
</div>
<div>
<span class="tl-default">Methods</span>
<p>some text here,</p>
</div>
<div>
</td>
<td colspan="2" valign="top">
<br><div>
<span class="tl-default">Objective</span>
<p>some text here,</p>
</div>
</td>

trying to fetch only not td containing class and align and for this i am using this method for my xpath :

$getnew="http://www.example.com/;
$html = new DOMDocument();
@$html->loadHtmlFile($getnew);
$xpath = new DOMXPath( $html );
$y = $xpath->query('//td[@colspan="2" and valign="top" and (not(@class and @align))]');
$ycnt = $y->length;
for ( $idf=6; $idf<$ycnt; $idf++) 
{ if($idf==6){
  echo "<p class='artbox'>".$y->item($idf)->nodeValue."</p>";}
}

i am new to this so please suggest your opinions

dongshuan8722
dongshuan8722 所有包含在此内容中的文字“”<tdcolspan=“2”valign=“top”>“”只有不在此“”<tdcolspan=“2”valign=“top”align=“left”>“”和在这个“”<tdcolspan=“2”valign=“top”class=“right”>“”@jack
接近 6 年之前 回复
dsfdsf21312
dsfdsf21312 预期结果是什么?
接近 6 年之前 回复

1个回答



你的逻辑问题是没有任何元素同时具有 @class </ code> 和</ em> @align </ code>,所以 not()</ code>总是会产生 true </ code>。</ p>

相反,你应该排除元素 具有以下任一属性:</ p>

  // td [@colspan =“2”和@ valign =“top”而不是(@  class或@align)] 
</ code> </ pre>

或者,要匹配只有这两个属性的元素,可以添加 count()</ code>条件 :</ p>

  // td [@colspan =“2”and @ valign =“top”and count(@ *)= 2  ] 
</ code> </ pre>

更新</ h3>

  $ query ='// td [@colspan =“2”and @valign  =“top”而不是(@class或@align)]'; 
foreach($ xpath-&gt; query($ query)as $ node){
//用$ node做一些事情
}
</ 代码> </ pre>
</ div>

展开原文

原文

The problem with your logic is that no elements have both @class and @align, so the not() will always yield true.

Instead you should exclude elements that have either attribute:

//td[@colspan="2" and @valign="top" and not(@class or @align)]

Alternatively, to match elements that only have those two attributes, you can add a count() condition:

//td[@colspan="2" and @valign="top" and count(@*)=2]

Update

$query = '//td[@colspan="2" and @valign="top" and not(@class or @align)]';
foreach ($xpath->query($query) as $node) {
    // do something with $node
}

doujia4759
doujia4759 真的没有太多代码可以显示; 我用我用过的东西更新了答案。
接近 6 年之前 回复
douya2007
douya2007 你给的逻辑必须工作,我只是编程的初学者,你可以给我你的代码
接近 6 年之前 回复
dpchen2004
dpchen2004 让我们在聊天中继续讨论。
接近 6 年之前 回复
dpfln86244
dpfln86244 我的预期结果是我只想要这个“”<td colspan =“2”valign =“top”>“”中的所有文字
接近 6 年之前 回复
duanji1899
duanji1899 是的,你的逻辑是正确的但是计数不起作用可能是我的循环逻辑不对,你可以检查一下
接近 6 年之前 回复
dongqiao8417
dongqiao8417 我已经测试了上面的内容,它在你的HTML上产生了三个元素(我假设是预期的结果,你还没有指定)... ...说,我已经更新了我的答案,包括一个替代方案。
接近 6 年之前 回复
douchan7552
douchan7552 没有不工作,但我想要不是语法,你会更好地使用NOT ... ??
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐