ElementTree是一个用于创建和解析XML的Python库。
就我而言,我有以下代码: 从 lxml 导入 etree as et 从 lxml.builder 导入 ElementMaker WSS_SCHEMA = "http://schemas.xmlsoap.org/ws/2002/12/secext" ACTOR_SCHEMA = "...
我有一个 HTML 文件,它的底部包含 XML 并附有注释,它看起来像这样: *** 我有一个 HTML 文件,它的底部包含 XML 并附有注释,它看起来像这样: <!DOCTYPE html> <html> <head> *** </head> <body> <div class="panel panel-primary call__report-modal-panel"> <div class="panel-heading text-center custom-panel-heading"> <h2>Report</h2> </div> <div class="panel-body"> <div class="panel panel-default"> <div class="panel-heading"> <div class="panel-title">Info</div> </div> <div class="panel-body"> <table class="table table-bordered table-page-break-auto table-layout-fixed"> <tr> <td class="col-sm-4">ID</td> <td class="col-sm-8">1</td> </tr> </table> </div> </div> </body> </html> <!--<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?> <ROOTTAG> <mytag> <headername>BASE</headername> <fieldname>NAME</fieldname> <val><![CDATA[Testcase]]></val> </mytag> <mytag> <headername>BASE</headername> <fieldname>AGE</fieldname> <val><![CDATA[5]]></val> </mytag> </ROOTTAG> --> 需求是解析上面HTML中注释中的XML。 到目前为止,我已经尝试读取 HTML 文件并将其传递给字符串并执行以下操作: with open('my_html.html', 'rb') as file: d = str(file.read()) d2 = d[d.index('<!--') + 4:d.index('-->')] d3 = "'''"+d2+"'''" 这是用 3 个单引号返回字符串 d3 中的 XML 数据片段。 然后尝试通过 Etree 阅读它: ET.fromstring(d3) 但失败并出现以下错误: xml.etree.ElementTree.ParseError:格式不正确(无效标记):第 1 行,第 2 列 基本上需要一些帮助: 阅读 HTML 取出 HTML 底部注释的 XML 片段 获取该字符串并传递给 ET.fromString() 函数,但由于该函数接受带有三重引号的字符串,因此它没有正确格式化并因此抛出错误 首先,通过逐行阅读并使用 if string.startswith 过滤掉评论块来拆分您的 html 和 xml: with open('xmlfile.xml') as fh: html, xml = [], [] for line in fh: # check for that comment line if line.startswith('<!--'): break html.append(line) # append current line xml.append(line) # keep iterating for line in fh: # check for ending block comment if line.startswith('-->'): break xml.append(line) # Get the root tag to close everything up root_tag = xml[1].strip().strip('<>') # add the closing tag and join, using the 4: slice to strip off block comment xml = ''.join((*xml, f'</{root_tag}>'))[4:] html = ''.join(html) 现在您应该能够使用您选择的解析器独立解析它们 你已经走上了正确的道路。我将您的 HTML 放入文件中,它工作正常,如下所示。 import xml.etree.ElementTree as ET with open('extract_xml.html') as handle: content = handle.read() xml = content[content.index('<!--')+4: content.index('-->')] document = ET.fromstring(xml) for element in document.findall("./mytag"): for child in element: print(child, child.text) 如果你一次一行地阅读文件,你会发现这更容易管理。 import xml.etree.ElementTree as ET START_COMMENT = '<!--' END_COMMENT = '-->' def getxml(filename): with open(filename) as data: lines = [] inxml = False for line in data.readlines(): if inxml: if line.startswith(END_COMMENT): inxml = False else: lines.append(line) elif line.startswith(START_COMMENT): inxml = True return ''.join(lines) ET.fromstring(xml := getxml('/Volumes/G-Drive/foo.html')) print(xml) 输出: <ROOTTAG> <mytag> <headername>BASE</headername> <fieldname>NAME</fieldname> <val><![CDATA[Testcase]]></val> </mytag> <mytag> <headername>BASE</headername> <fieldname>AGE</fieldname> <val><![CDATA[5]]></val> </mytag> </ROOTTAG> 随着 html.parser() (Doc) 中的构建,您可以将 xml 注释作为字符串获取,您可以使用 xml.entree.ElementTree 进行解析: from html.parser import HTMLParser import xml.etree.ElementTree as ET class MyHTMLParser(HTMLParser): def handle_comment(self, data): xml_str = data tree = ET.fromstring(xml_str) for elem in tree.iter(): print(elem.tag, elem.text) parser = MyHTMLParser() with open("your.html", "r") as f: lines = f.readlines() for line in lines: parser.feed(line) 输出: ROOTTAG mytag headername BASE fieldname NAME val Testcase mytag headername BASE fieldname AGE val 5
我想删除包含命名空间的特定元素的属性。 在以下元素中: 我想删除 xsi:nil...
如何在 python 中基于父标签名称在嵌套 xml 中添加新元素
我有 config.json 文件,我需要根据配置文件生成 xml 文件 我的配置文件看起来像。 { “元素”:[ { “元素类型”:“根”, ...
XML : lxml.etree - findall() when document element has attributes
.findall() 在文档元素具有属性时找不到任何内容。为什么会出现这种行为以及如何解决? 这是代码: 从 lxml 导入 etree as et 文本 = '''\ .findall() 当文档元素具有属性时找不到任何内容。为什么会出现这种行为以及如何解决? 代码如下: from lxml import etree as et text = '''\ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\ <text class="what1 y2">abc</text><text class="what17 x1">nbc</text>\ <text class="f18 sf4 f12" textLength="72.18">ID_NUM.47</text></svg>''' tree = et.fromstring(text) for elem in tree.findall(".//text"): if elem.text == "ID_NUM.47": elem.getparent().remove(elem) print(et.tostring(tree)) tree.findall(".//text") 返回一个空列表。 但是对于以下文档,其中删除了svg标签属性,找到了所有元素: text = '''\ <svg><text class="what1 y2">abc</text><text class="what17 x1">nbc</text>\ <text class="f18 sf4 f12" textLength="72.18">ID_NUM.47</text></svg>''' 此外,例如,当用 .findall() 替换 .xpath('//*[attribute::textLength]') 时,所有元素都在两个文档中找到。
我必须处理一些 XML 文件,与我在教程中看到的相比,这些文件似乎解析得很奇怪。 文字 文本2 ...
如何为 Minidom 中的特定节点使用 getElementsByTagName
我的 XML 看起来像这样 JKH 我的 XML 看起来像这样 <TOPIC> <LIST> <Area>JKH</Area> <USED> <type id='123' /> <type id='345' /> </USED> <DEMAND> <type id='809' /> <type id='321' /> </DEMAND> <CLOSED> <type id='456' /> <type id='765' /> </CLOSED> </LIST> </TOPIC> 这里我只想打印id下的<DEMAND>。我试过下面的代码。 from xml.dom import minidom root=minidom.parse('sample.xml') tag=root.getElementsByTagName('type') for i in tag: print(i.getAttribute("id")) 但是这是打印所有id值,如下所示。 123 345 809 321 456 765 我怎样才能只获得809标签下的321和<DEMAND>。我可以在 ElementTree 中给出路径,但不确定如何在 getElementsByTagName 中让步?在 Minidom 中甚至可能吗? for demand in root.getElementsByTagName('DEMAND'): for tp in demand.getElementsByTagName('type'): print(tp.getAttribute("id"))
在 python 中现有 XML 文件中特定但未定义的位置之后添加新的 XML 元素
我想将一个新的 XML 元素添加到现有的 XML 文件中,问题是位置因文件而异,但我想始终将我的新元素插入特定元素的最后一个标签之后...
我有一个 XML 文件,我只需要更改其中的 2 个属性: 我有一个 XML 文件,我只需要更改其中的 2 个属性: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> <Document> <name>lines.kmz</name> <Style id="LineStyle00"> <LabelStyle> <color>00000000</color> <scale>0</scale> </LabelStyle> .............. 我需要更改的是colo标签内的scale和labelstyle。 这是我试过的: import xml.etree.ElementTree as ET def update_label_style(kml_path, new_color, new_scale): # parse the KML file tree = ET.parse(kml_path) root = tree.getroot() # define the namespace for KML elements ns = {'kml': 'http://www.opengis.net/kml/2.2'} # find all LabelStyle elements and update their color and scale values for label_style in root.findall('.//kml:LabelStyle', ns): label_style.find('kml:color', ns).text = new_color label_style.find('kml:scale', ns).text = new_scale # write the updated KML file back to disk tree.write(kml_path, encoding='utf-8', xml_declaration=True) print("Changed the label style") 编辑完成后,XML 文件如下: <?xml version='1.0' encoding='utf-8'?> <ns0:kml xmlns:ns0="http://www.opengis.net/kml/2.2"> <ns0:Document> <ns0:name>lines.kmz</ns0:name> <ns0:Style id="LineStyle00"> <ns0:LabelStyle> 问题是它在每个标签之前添加了ns0,它还删除了整行 <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
我知道 StackOverflow 上有不同的类似主题,但我无法找出我的示例中的问题。 我有一个模板 xml 文件。我想使用这个模板来添加新的子元素并保存...
Python 新手,在从 URL 源转换为 XML 时遇到问题。尝试了很多方法来修复代码,但卡住了。任何建议都会非常有帮助! 下面的程序错误在'xtre ...
我正在尝试使用 e.find('..)' 访问树中元素的父节点,但它不起作用。对于以下代码: 将 xml.etree.ElementTree 导入为 etree xml =“<...
这说 input 是 ET 的一个对象,但 input 不是一个函数吗?此外,我从来没有创建过一个名为 input 的对象,为什么会这样呢? 我应该怎么做才能解决这个问题? 代码: 导入 xml.etree.Element...
如何使用 ElementTree 在 Python 中获取下面提到的 xml 的值?
我正在使用 ElemetTree 迭代所有 xml 标记。而我的一些 xml 内容看起来像下面的 xml。当迭代 xml 时, 标记文本为 None 而不是“This is the Resul ...
exception':“无法解析 QName 'SOAP:',第 1 行,第 7 列
我从 api 得到了这个 xml,但之后我想使用 xpath 获取 xml 属性的值,但在第一步 树 = etree.parse(StringIO(hotel_details_logs)) 我有异常...
我正在尝试使用 Python 将 XML 文件转换为 CSV 文件。我在试图查找的 XML 中有两个值。 这是我的代码: 导入 csv 将 xml.etree.ElementTree 导入为 ET 定义主要(): #
使用xml.etree.elementtree来处理xml与xmlns="http://www.w3.org/2005/Atom"
我正在尝试处理从网络中提取的数据。解码后的原始数据是 xml 文件的字节。我有一些旧代码神奇地起作用了。但是,我不确定他们在做什么,因为我...
我有 df,我将其转换为 python 字典,然后将其转换为 xml 格式。 A列 B列 获取标题 地位 获取标题 时间戳 提交图书 标题 提交图书 日期 提交图书 页数 我...