美文网首页程序员
xpath一些经验记录

xpath一些经验记录

作者: 过年啦 | 来源:发表于2018-12-23 19:38 被阅读0次

常做爬虫的人肯定是对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")

其他的遇到了再继续添加...

相关文章

网友评论

    本文标题:xpath一些经验记录

    本文链接:https://www.haomeiwen.com/subject/xmnnkqtx.html