常做爬蟲的人肯定是對xpath非常地熟悉了,在這么多h5元素選擇器當中根竿,我還是最喜歡xpath截碴。
下面就來記錄一些xpath當中用到的東西:
class選擇器的問題
一般來說選擇某個元素的選擇器都是這樣子的:
from lxml import etree
html = "<div id="myDiv">123</div>"
HTML = etree,HTML(html)
# select div
div = HTML.xpath("http://div[@id='myDiv']")
但是在實際使用當中憔辫,需要選擇的內(nèi)容其實不會是有id的一般都是由class或者name這樣的屬性進行選擇的。
但是一般為了控制樣式金顿,class的屬性值一般都具有很多個臊泌,但是[@id="xxx"]這樣子的選擇器只能選擇value只有一個的屬性,這樣子用上面的id選擇器就沒辦法選擇了揍拆。
這時候就需要使用contains語法了渠概,像這樣:
from lxml import etree
html = "<div class="class1 class2">123</div>"
HTML = etree,HTML(html)
# select div
div = HTML.xpath("http://div[contains(@class, 'class1')]")
# if select both classed
div = HTML.xpath("http://div[contains(@class, 'class1') and div[contains(@class, 'class1') ]")
提取文本內(nèi)容問題
提取文本內(nèi)容使用的是/text()語法大家應該都很了解了,一個簡單的例子而言:
from lxml import etree
html = "<div id="myDiv">123</div>"
HTML = etree,HTML(html)
# select div
div = HTML.xpath("http://div[@id='myDiv'/text()]")
# output :
# 123
網(wǎng)上有人說,范式可以使用string(".")來提取所有的文本嫂拴,但是我這樣試過了高氮,提示我的是語法錯誤慧妄,不知道是我寫錯了,還是已經(jīng)棄用了剪芍,但是使用/text()標簽就可以很好地提取文本了塞淹,完全滿足需要。
for循環(huán)和子元素問題
這個問題在我剛開始使用xpath的使用困擾了我好久罪裹。
在我們實際的運用當中饱普,我們肯定要針對例如像列表,表格這樣的循環(huán)的元素進行提取状共。
在python當中套耕,也就涉及到了xpath的二次調(diào)用。
但是在第二次寫xpath的時候峡继,注意不要再帶上/了
from lxml import etree
html = "<ul><li><div></div></li><li><div></div></li></ul>"
HTML = etree,HTML(html)
# select div
li = HTML.xpath("http://li]")
for l in li:
# wrong
li_div = l.xpath("/div")
# right
li_div = l.xpath("div")
其他的遇到了再繼續(xù)添加...