用lxml和xpath获取了10个
  • element,但是不能再遍历每个li用xpath获取li里面的a标签

    Tsbasa 2018-06-01 09:50:44
    html是这样的:
    <li class="lx1">
    <div class="tit">
    <a href="#">链接</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>

    我先用'//div[@class="lx1"]'获取所有的li,现在取到的是一个list,里面是etree的element,

    然后再for i in elements:循环再对每个i用xpath查询'//div[@class='tit']/a/text()'来获取每个li下面的a标签的文字,

    但是我用i.xpath()取获取到的a标签不止当前li下面的,它就像是对整个html执行了这个xpath,把其他li下面的a也查出来了。。。

    望各位指正一下
    ...全文
    2024 11 打赏 收藏 转发到动态 举报
    写回复
    用AI写文章
    11 条回复
    切换为时间正序
    请发表友善的回复…
    发表回复
    a441847654 2020-11-07
    • 打赏
    • 举报
    回复
    从逻辑上讲还是没有弄明白是什么原因导致的出现这样的结果,但是8楼的回复确实可以解决问题。坐等大佬讲解原因
    浊仁 2019-11-17
    • 打赏
    • 举报
    回复
    8楼正解啊,简单有效
    zhenghailong888 2019-10-15
    • 打赏
    • 举报
    回复
    我遇到和你相同的问题了,这些帖子回答在我看来 好像是 自问自答,不过也获取了写思路,谢谢
    Aliz_ 2018-08-19
    • 打赏
    • 举报
    回复
    大神们没有解释。但他们都是在路径前面加了./,表示在当前节点查询,就不会继续查询到下一个节点。
    Tsbasa 2018-06-01
    • 打赏
    • 举报
    回复
    引用 1 楼 oyljerry 的回复:
    
    './/div[@class='tit']/a/text()'
    
    版主,是不是取出来的<li>的list再用xpath的话实际上是对整个页面使用的啊?我打印每个li都是不一样的,但是只要用xpath去每个li里面再去取东西就会把整个html里面的a都取出来,懵逼
    oyljerry 2018-06-01
    • 打赏
    • 举报
    回复
    
    './/div[@class='tit']/a/text()'
    
    屎克螂 2018-06-01
    • 打赏
    • 举报
    回复
    推荐你用更简单的库 pyquery https://www.cnblogs.com/lei0213/p/7676254.html
    Tsbasa 2018-06-01
    • 打赏
    • 举报
    回复
    上午弄来弄去最后每次我先把for i in eles: 的i转换为str,然后我再把它转换etree.HTML(str),再查就不会把所有的查出来,感觉好蠢啊
    Tsbasa 2018-06-01
    • 打赏
    • 举报
    回复
    引用 4 楼 hbu_pig 的回复:
    感觉并没有
    import xml.etree.ElementTree as etree
    tree =etree.parse('text.xml')
    lis=tree.findall("//li[@class='{}']".format('lx1'))
    for li in lis:
        print(li)
        aa=li.findall(".//div[@class='{}']/a".format('tit'))
        for a in aa:
            print(a.text)
    输出: <Element 'li' at 0x7f491d1530e8> 链接1 链接1.1 <Element 'li' at 0x7f4914feb4f8> 链接2 <Element 'li' at 0x7f4914feb638> 链接3 text.xml:
    <root>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接1</a>
    </div>
    <div class="inf">
    <div class="tit">
    <a href="#">链接1.1</a>
    </div>
    </div>
    </li>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接2</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接3</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>
    </root>
    我没有用findall用了两次xpath就会查出所有的,用老哥你这样的就没问题,感谢了,我看看为啥子会有这种区别
    欢乐的小猪 2018-06-01
    • 打赏
    • 举报
    回复
    感觉并没有
    import xml.etree.ElementTree as etree
    tree =etree.parse('text.xml')
    lis=tree.findall("//li[@class='{}']".format('lx1'))
    for li in lis:
        print(li)
        aa=li.findall(".//div[@class='{}']/a".format('tit'))
        for a in aa:
            print(a.text)
    输出: <Element 'li' at 0x7f491d1530e8> 链接1 链接1.1 <Element 'li' at 0x7f4914feb4f8> 链接2 <Element 'li' at 0x7f4914feb638> 链接3 text.xml:
    <root>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接1</a>
    </div>
    <div class="inf">
    <div class="tit">
    <a href="#">链接1.1</a>
    </div>
    </div>
    </li>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接2</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>
    <li class="lx1">
    <div class="tit">
    <a href="#">链接3</a>
    </div>
    <div class="inf">
    ...
    </div>
    </li>
    </root>
    ghostgoodbye 2018-06-01
    • 打赏
    • 举报
    回复
    你用for i in elements:应该都会查出来吧

    37,719

    社区成员

    发帖
    与我相关
    我的任务
    社区描述
    JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
    社区管理员
    • 脚本语言(Perl/Python)社区
    • IT.BOB
    加入社区
    • 近7日
    • 近30日
    • 至今

    试试用AI创作助手写篇文章吧