vainquit 2019-03-29 23:11 采纳率: 100%
浏览 3558
已采纳

lxml.etree有个getchildren()的方法被废弃了,那该用什么来替代?

情况比题目问的复杂一些。我抓了个响应体,然后用etree的方式解析:
r=etree.HTML(requests.post(link,{"filter_by_status":pattern},headers).text)

这样我就可以使用xpath了。但后来遇到一个问题:lxml有一个getparent的方法,可是getchildren的方法却被废弃了,我无法获得某个节点的子元素。

我不是要//a[@id='3']/following-sibling::a[1] 这样使用路径获得节点的方法,我要的是getchildren()这种使用函数返回节点的方法。

我查了一下
python的文档( http://omz-software.com/pythonista/docs/library/xml.etree.elementtree.html ) ,它对getchildren的描述如下:getchildren():
Deprecated since version 3.2: Use list(elem) or iteration.

我不太清楚list(elem)是啥;至于后面那个iteration就更不清楚,再接着查,不知道哪里查到了个ET.SubElement()的方法(需要先import xml.etree.ElementTree as ET),这个方法似乎最接近我的需求,然而当我使用这个方法来查询某节点的子节点时候,程序报错了:TypeError: SubElement() argument 1 must be xml.etree.ElementTree.Element, not lxml.etree._Element。 也就是说我使用xpath获得的那个节点是 lxml.etree._Element,但这个方法只有xml.etree.ElementTree.Element才能使用。但网络上关于lxml.etree._Element少之又少。我真的很懵逼,为什么查询一个子节点就那么难呢?是不是我哪里一开始就弄错了?希望能给个例子,谢谢!

  • 写回答

2条回答 默认 最新

  • vainquit 2019-03-31 16:26
    关注

    没想到最后还是要靠自力更生啊。。。等了2天只有楼上刷了个莫名其妙问东答西的答案,可能是我问的比较没水平吧
    不过这个问题我是彻底弄明白了,写出来给后面的有缘人
    首先,我之前自己没有我完全搞懂xpath的用法。
    xpath的路径确实大多数是类似于这样的形式:/html/body/td/tr或者//tr
    前者表示从根目录开始按照路径搜索,后者表示全文开始搜索
    那如果现在我们已经得到一个节点了,有没有办法就从那个节点开始搜索(而不是像上面一样要么从根目录搜索,要么全文搜呢?)
    有的。比如我们已经得到了一个节点(假设这个节点唯一)t=xpath("/html/body/td/tr")
    那么它的父节点,可以用etree的方法t.getparent()来表示
    至于它的子节点,如问题描述所示,getchildren()的方法已经被废弃了,需要用list(elem)的方法或者iterator的方法来访问
    所谓的list(elem),其实就是访问数组。例如t有10个子节点,那么t[1]就是它其中一个子节点,就是这么简单!
    如果想我不是靠下标来访问,而靠节点标签来访问呢?有另外一种方法,find(),例如t.find("div")就是访问t节点第一个div的子节点
    但还有一个问题,假如这个t下面又很多个div节点,每个都有不同的class属性,我想精确定位某个class=“asdf"的标签该如何?
    那就只能用最好的这种方法:t.xpath('.//div[@class="asdf"]')
    这个xpath,是用用一个点号"."作为起始的(而不是我们平时熟悉的/或者//,就是这么一个点号,代表了当前的元素(也就是t这个标签)。这个其实算是常识吧,我一直都不知道,也是汗颜。。。。另外,双点号".."就代表父节点了。所以不是并不是所有xpath都是用/或//来起始的,有了这个方法,什么getparent通通都可以丢弃了。
    算是闹了个乌龙,但我相信有人会和我遇到一样的问题,毕竟自学并不是每个人都那么一帆风顺的,就这样吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机