我們通常使用xpath的用處是選擇某個或者某些節(jié)點(diǎn)匪蟀,但是如果我們的業(yè)務(wù)變成“需要選擇去掉某個節(jié)點(diǎn)辕坝,然后拿到其他節(jié)點(diǎn)”纱耻,這個時候該怎么辦呢?
其實(shí)xpath中有個功能叫做not(name())可以刪除一類tag的所有節(jié)點(diǎn)砚蓬,如下所示:
等等矢门。。灰蛙。我們先得有一個html的頁面結(jié)構(gòu)祟剔。方便大家的查看。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Storm</title>
</head>
<body>
<h1 id="h1" name="hname" class="cname">這是一個h1標(biāo)簽</h1>
<h1 id="h2" name="hname" class="cname2">這是一2個h1標(biāo)簽</h1>
<form class="logo">
文本域1:<input type="text" name="first_name">
<br>
文本域2:<input type="text" name="last_name">
</form>
<form>
密碼字段:<input type="password" name="password">
</form>
<form>
單選按鈕1:
<input type="radio" name="radio1" value="nan">male
<input type="radio" name="radio1" value="nv">female
</form>
<form>
寵物:
<input type="checkbox" name="cw1">貓
<input type="checkbox" name="cw">狗
<input type="checkbox" name="cw">兔子
</form>
</body>
</html>
下面祭出我們的xpath代碼:
html.xpath('/html/body/*[not(name()="form")]//text()')
結(jié)果如下:
['這是一個h1標(biāo)簽', '這是一2個h1標(biāo)簽']
這種方法在功能上是可以實(shí)現(xiàn)的摩梧,但是又一個問題物延,他完全刪除了整個tag,也就是說整個名為form的所有tag都被刪除了仅父,這個其實(shí)殺傷范圍過大叛薯,有時候我們并不希望這樣,因?yàn)槲覀兿胍獎h除的可能只是某幾個tag笙纤,而不是一類tag耗溜,但是其實(shí)處理方式比較簡單 我們自定義一個tag name,我們利用正則將我們打算刪除的某個<form</form>改成<connerform></connerform>,然后將not(name()="form")改為not(name()="connerform")省容,這樣就可以了抖拴,既然我們都用正則來替換了,為什么不直接來刪除呢腥椒?簡直多此一舉啊阿宅,那有沒有原生的方法供我們使用呢?答案是有的笼蛛,我們需要用到的寫法如下:
html.xpath("http://h1[@name='hname' and not(contains(@class,'cname2'))]//text()")
結(jié)果如下:
['這是一個h1標(biāo)簽']
整個方法其實(shí)是這樣的洒放,在中括號(我們知道中括號是用來寫某個標(biāo)簽的屬性的,我們在這里做文章滨砍,使用not字段 not contains就好了)