常做爬虫的人肯定是对xpath非常地熟悉了,在这么多h5元素选择器当中,我还是最喜欢xpath。
下面就来记录一些xpath当中用到的东西:
class选择器的问题
一般来说选择某个元素的选择器都是这样子的:
from lxml import etree
html = "<div id="myDiv">123</div>"
HTML = etree,HTML(html)
# select div
div = HTML.xpath("//div[@id='myDiv']")
但是在实际使用当中,需要选择的内容其实不会是有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("//div[contains(@class, 'class1')]")
# if select both classed
div = HTML.xpath("//div[contains(@class, 'class1') and div[contains(@class, 'class1') ]")
提取文本内容问题
提取文本内容使用的是/text()语法大家应该都很了解了,一个简单的例子而言:
from lxml import etree
html = "<div id="myDiv">123</div>"
HTML = etree,HTML(html)
# select div
div = HTML.xpath("//div[@id='myDiv'/text()]")
# output :
# 123
网上有人说,范式可以使用string(".")来提取所有的文本,但是我这样试过了,提示我的是语法错误,不知道是我写错了,还是已经弃用了,但是使用/text()标签就可以很好地提取文本了,完全满足需要。
for循环和子元素问题
这个问题在我刚开始使用xpath的使用困扰了我好久。
在我们实际的运用当中,我们肯定要针对例如像列表,表格这样的循环的元素进行提取。
在python当中,也就涉及到了xpath的二次调用。
但是在第二次写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("//li]")
for l in li:
# wrong
li_div = l.xpath("/div")
# right
li_div = l.xpath("div")
其他的遇到了再继续添加...
网友评论