美文网首页程序员
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