vainquit
2019-03-29 23:11
采纳率: 78.4%
浏览 2.9k

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通通都可以丢弃了。
    算是闹了个乌龙,但我相信有人会和我遇到一样的问题,毕竟自学并不是每个人都那么一帆风顺的,就这样吧

    点赞 8 评论
  • devmiao 2019-03-29 23:56
    点赞 评论

相关推荐 更多相似问题