Python *** 作 DOM(待更)

Python  *** 作 DOM(待更),第1张

xmletreeElementTree 模块实现了一个简单高效的API,用于解析和创建XML数据。

XML是一种固有的分层数据格式,最自然的表示方法是使用树。 ET ( xmletreeElementTree ) 有两个类: ElementTree 将整个XML文档表示为一个树, Element 表示该树中的单个节点。与整个文档的交互(读写文件)通常在 ElementTree 级别完成。与单个XML元素及其子元素的交互是在 Element 级别完成的。

可以通过从文件中读取来导入此数据:

或直接从字符串中解析:

fromstring() 将XML从字符串直接解析为 Element ,该元素是已解析树的根元素。其他解析函数可能会创建一个 ElementTree 。更多信息请查阅文档。

作为 Element , root 具有标签和属性字典:

还有可以迭代的子节点:

子级是可以嵌套的,我们可以通过索引访问特定的子级节点:

Element 实例元素的长度是其子元素的数量。那意味着如果你要检查元素是否真的为空,则应同时检查它的长度和它的 text 属性。元素标签,属性名称和属性值可以是字节或字符串。

Element 是一个灵活的容器对象,旨在将分层数据结构存储在内存中。可以说是 list 和 dict 之间的交叉。每个元素都有许多与之关联的属性:

例如: <tag attrib>text<child/></tag>tail 。

要创建元素实例,请使用 Element 构造函数或 SubElement 工厂函数。您还可以使用 ElementTree 类包装元素结构,并将其与 XML 相互转换。

考虑到元素的可拓展性,最好使用 SubElement 工厂函数,来生成子元素。上面的子元素可以这样生成:

XPath 全称为 Xml Path Language,即 Xml 路径语言,是一种在 Xml 文档中查找信息的语言。它提供了非常简洁的路径选择表达式,几乎所有的节点定位都可以用它来选择。

XPath 可以用于 Xml 和 Html,在爬虫中经常使用 XPath 获取 Html 文档内容。

lxml 是 Python 语言用 Xpath 解析 XML、Html文档功能最丰富的、最容易的功能模块。

节点

在 XPath 中有七种节点分别是元素、属性、文本、文档、命名空间、处理指令、注释,前3种节点为常用节点

请看下面的 Html 例子,(注:这个例子全文都需要使用)

在上面的例子中

节点关系

在 XPath中有多中节点关系分别是父节点、子节点、同胞节点、先辈节点、后代节点

在上面的例子中

用上面的 Html 文档举个例子

同样用上面的Html文档举个例子

XPath 中的谓语就是删选表达式,相当于 SQL 中的 Where 条件,谓语被嵌在 [ ] 中

lxmletree 一个强大的 Xml 处理模块,etree 中的 ElementTree 类是一个主要的类,用于对XPath的解析、增加、删除和修改节点。

etreeparse() 函数可以解析一个网页文件还可以解析字符串, 在网页中下载的数据一般都是字符串形式的,使用 parse(StringIO(str)) 将整个页面内容解析加载构建一个 ElementTree 对象,ElementTree 可以使用 XPath 语法精准找到需要的数据。

结果:

2 获取所有 li 标签数据

结果:

3 获取带 class=’blank’ 属性数据

结果:

4 属性 *** 作

结果:

5 获取最后一个p标签数据

结果:

6 添加子节点

7 删除子元素

8 遍历元素后代

结果

我给你个示例代码,你自己改改增加子节点那一段就好了。

#!/usr/bin/python

# -- coding=utf-8 --

# author : wklken@yeahnet

# date: 2012-05-25

# version: 01

from xmletreeElementTree import ElementTree,Element

def read_xml(in_path):

    '''读取并解析xml文件

       in_path: xml路径

       return: ElementTree'''

    tree = ElementTree()

    treeparse(in_path)

    return tree

def write_xml(tree, out_path):

    '''将xml文件写出

       tree: xml树

       out_path: 写出路径'''

    treewrite(out_path, encoding="utf-8",xml_declaration=True)

def if_match(node, kv_map):

    '''判断某个节点是否包含所有传入参数属性

       node: 节点

       kv_map: 属性及属性值组成的map'''

    for key in kv_map:

        if nodeget(key) != kv_mapget(key):

            return False

    return True

#---------------search -----

def find_nodes(tree, path):

    '''查找某个路径匹配的所有节点

       tree: xml树

       path: 节点路径'''

    return treefindall(path)

def get_node_by_keyvalue(nodelist, kv_map):

    '''根据属性及属性值定位符合的节点,返回节点

       nodelist: 节点列表

       kv_map: 匹配属性及属性值map'''

    result_nodes = []

    for node in nodelist:

        if if_match(node, kv_map):

            result_nodesappend(node)

    return result_nodes

#---------------change -----

def change_node_properties(nodelist, kv_map, is_delete=False):

    '''修改/增加 /删除 节点的属性及属性值

       nodelist: 节点列表

       kv_map:属性及属性值map'''

    for node in nodelist:

        for key in kv_map:

            if is_delete:

                if key in nodeattrib:

                    del nodeattrib[key]

            else:

                nodeset(key, kv_mapget(key))

               

def change_node_text(nodelist, text, is_add=False, is_delete=False):

    '''改变/增加/删除一个节点的文本

       nodelist:节点列表

       text : 更新后的文本'''

    for node in nodelist:

        if is_add:

            nodetext += text

        elif is_delete:

            nodetext = ""

        else:

            nodetext = text

               

def create_node(tag, property_map, content):

    '''新造一个节点

       tag:节点标签

       property_map:属性及属性值map

       content: 节点闭合标签里的文本内容

       return 新节点'''

    element = Element(tag, property_map)

    elementtext = content

    return element

           

def add_child_node(nodelist, element):

    '''给一个节点添加子节点

       nodelist: 节点列表

       element: 子节点'''

    for node in nodelist:

        nodeappend(element)

           

def del_node_by_tagkeyvalue(nodelist, tag, kv_map):

    '''同过属性及属性值定位一个节点,并删除之

       nodelist: 父节点列表

       tag:子节点标签

       kv_map: 属性及属性值列表'''

    for parent_node in nodelist:

        children = parent_nodegetchildren()

        for child in children:

            if childtag == tag and if_match(child, kv_map):

                parent_noderemove(child)

                           

if __name__ == "__main__":

       

    #1 读取xml文件

    tree = read_xml("/testxml")

       

    #2 属性修改

      #A 找到父节点

    nodes = find_nodes(tree, "processers/processer")

      #B 通过属性准确定位子节点

    result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})

      #C 修改节点属性

    change_node_properties(result_nodes, {"age": "1"})

      #D 删除节点属性

    change_node_properties(result_nodes, {"value":""}, True)

       

    #3 节点修改

      #A新建节点

    a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")

      #B插入到父节点之下

    add_child_node(result_nodes, a)

       

    #4 删除节点

       #定位父节点

    del_parent_nodes = find_nodes(tree, "processers/services/service")

       #准确定位子节点并删除之

    target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})

       

    #5 修改节点文本

       #定位节点

    text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})

    change_node_text(text_nodes, "new text")

       

    #6 输出到结果文件

    write_xml(tree, "/outxml")

      

以上就是关于Python *** 作 DOM(待更)全部的内容,包括:Python *** 作 DOM(待更)、爬虫必备 XPath 和 lxml、python *** 作xml文件问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10076425.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存