lxml是一个功能齐全的高性能Python库,用于处理XML和HTML。
我需要使用 lxml 库在正确的位置插入元素属性。 以下是我尝试在 attr3 属性前面插入 attr2 属性的示例: 来自 lxml 我...
我是网络抓取新手,希望从一些特定的 TripAdvisor 网站(例如此示例)获取特定值,我需要清洁度值,在本例中为 4.5。无论 H 的哪一部分...
我想用python和beautifulsoup从data-bem解析url,但我不能这样做,如何解决这个问题?使用selenium获取html,用beautifulsoup和data-bem解析,就像它不在...
我可以插入这样的元素: Product_node.insert(cnt, etree.Element("vod_type")) 是否可以执行以下操作: Product_node.insert(cnt, etree.Element("vod_type").te...
解析请求响应时应该使用 .text 还是 .content?
我偶尔使用 res.content 或 res.text 来解析请求的响应。在我的用例中,我使用哪个选项似乎并不重要。 解析 HTML 的主要区别是什么...
我找到了一个具有特定类的对象: THREAD = TREE.find_class('线程')[0] 现在我想获取作为其直接子元素的所有 元素。 我试过: THREAD.findall("p") 线程.x... 我找到了一个具有特定类别的对象: THREAD = TREE.find_class('thread')[0] 现在我想获取其直接子元素的所有 <p> 元素。 我尝试过: THREAD.findall("p") THREAD.xpath("//div[@class='thread']/p") 但是所有这些都会返回此 <p> 内的所有 <div> 元素,无论该 <div> 是否是它们最近的父级。 我怎样才能让它发挥作用? 编辑: 示例 html: <div class='thread'> <p> <!-- 1 --> <!-- Can be some others <p> objects inside, which should not be counted --> </p> <p><!-- 2 --></p> </div> <div class='thread'> <p>[...]</p> <p>[...]</p> </div> 脚本应该找到两个对象<p>,它们是THREAD的子对象。我应该收到两个对象的列表,在示例 HTML 的注释中标记为“1”和“2”。 编辑2: 又一个澄清,因为人们会感到困惑: THREAD是存储在变量中的一些对象,可以是任何html元素。我想找到 <p> 对象,它们是 THREAD 的直接子对象。这些 <p> 不能位于 THREAD 外部,也不能位于 THREAD 内部的任何元素内部。 我不确定,但你的问题似乎出在 HTML 本身:请注意 有几个标签省略情况适用于 p 节点,因此段落的结束标签 <div class='thread'> <p>first <p>second</p> </p> </div> 简单地被解析器忽略,并且两个节点都被标识为兄弟节点,但不是父节点和子节点,例如 <div class='thread'> <p>first <p>second </div> 所以 XPath //div[@class="thread"]/p 会返回两个段落 您只需将 p 标签替换为 div 标签,您就会看到不同的行为: <div class='thread'> <div>first <div>second</div> </div> </div> 这里//div[@class="thread"]/div将仅返回第一个节点 如果我的假设不正确,请纠正我 尝试这个 XPath 表达式: //p[parent::div[@class='thread']] 或者用完整的Python表达式: THREAD.xpath("//p[parent::div[@class='thread']]") 另一种(逆)方法是这个 XPath 表达式: div[@class='thread']/child::p" 使用直接 child:: 轴并且仅选择直接子节点。 总结: 两个表达式中哪一个更快取决于 XPath 编译器。 child:: 是默认轴,如果没有给出其他轴则使用。 仅供参考:XPath 计数从 1 开始,并且 不是 0。 因此,关于您的 XML 示例,以下表达式 count(//div[@class='thread'][1]/child::p) 的结果是 2 - 计算 <p> <!-- 1 --> + <p><!-- 2 --></p> 的结果。 你可以尝试PARENT.getchildren() >>> root = etree.fromstring(xml) >>> root.xpath("//div[@class='thread']")[0].getchildren() [<Element p at 0x10b3110e0>, <Element p at 0x10b311ea8>]
我有以下html: 标题 1 啊啊 ... 我有以下html: <div id = "big"> <span>header 1</span> <ul id = "outer"> <li id = "inner">aaa</li> <li id = "inner">bbb</li> </ul> <span>header 2</span> <ul id = "outer"> <li id = "inner">ccc</li> <li id = "inner">ddd</li> </ul> </div> 我希望它按顺序循环播放: header 1 aaa bbb header 2 ccc ddd 我尝试循环遍历每个 ul,然后打印标题和 li 值。但是,我不知道如何获取与 ul 关联的 span 标头。 sets = tree.xpath("//div[@id='big']//ul[@id='outer']") for set in sets: # Print header. Not sure how to get it header = set.xpath(".//li/preceding-sibling::span") print header # Print texts. This works. values = set.xpath(".//li//text()") for v in values: print v 仅循环所有文本节点是行不通的,因为我需要知道它是标题还是 li 值。 这有效: header = ingred_set.getprevious().xpath(".//text()")[0] 对于 HTML,请使用 BeautifulSoup。它让您可以直接访问上一个和下一个兄弟姐妹: sibling_soup.b.next_sibling # <c>text2</c> sibling_soup.c.previous_sibling # <b>text1</b> 此外,你可以告诉 BS 在 constructor 中使用 lxml 解析器。从实践中我可以看出,在格式不正确的输入中,lxml比默认的html.parser表现更好
Python LXML:如何删除两个指定标签之间的所有标签?
我有一个 xml 文件(word.docx 文件的 document.xml),我需要从中删除某些部分。 结构是这样的: 我有一个 xml 文件(word.docx 文件的 document.xml),我需要从中删除某些部分。 结构是这样的: <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> Bunch of nested tags </w:p> <w:p> Bunch of nested tags to delete </w:p> <w:p> Bunch of nested tags to delete </w:p> <w:tbl> Bunch of nested tags to delete </w:tbl> <w:p> Bunch of nested tags </w:p> </w:body> </document> 我想删除 2 个指定边界标签之间的所有标签及其所有内容。 我想包含 startTag 并排除 endTag,并删除之间的所有内容。 我的两个边界标签是 标签,在 标签之间还有一堆其他标签,例如 标签,我也想删除它们。 我的问题是我不知道如何删除所有这些标签。 有什么帮助吗? 期望的输出是: <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> Bunch of nested tags </w:p> <w:p> Bunch of nested tags </w:p> </w:body> </document> 这是我尝试过的: 我成功获得了边界标签: startTag = parentBoundaryTags[3] endTag = parentBoundaryTags[4] 边界标签值为: <Element p at 0x12cf32ccfa0> <Element p at 0x12cf32ccff0> 我尝试获取边界标签的共同父级,因为根据我的研究,我似乎需要它来删除其下面的元素: common_ancestor = startTag.getparent() common_ancestor 值为: <Element body at 0x12cf32cccd0> 这对我来说很有意义,因为它对应于我的 xml 结构;这就是我期望看到的。 我使用 getchildren() 来迭代 标签的所有直接子代。 我正在尝试删除 标签的所有直接子代,从 标签的直接子代相当于我的 startTag 边界标签的点开始。 我正在尝试继续删除 的直接子级,直到到达相当于我的 endTag 边界标记的直接子级。 # Flag to indicate whether to start removing elements start_removal = False # List to store elements to be removed elements_to_remove = [] # Iterate over the children of the common ancestor for child in common_ancestor.getchildren(): if child == startTag: start_removal = True elements_to_remove.append(child) elif child == endTag: start_removal = False break elif start_removal: elements_to_remove.append(child) # Remove the collected elements for element in elements_to_remove: common_ancestor.remove(element) # Write the modified XML tree back to the document.xml file tree.write(document_xml, encoding='utf-8', xml_declaration=True) 我希望这会删除边界标签之间的所有标签,但它根本没有删除任何内容。 有人可以帮忙吗? 这是一个基于XSLT的解决方案。 它使用所谓的“身份转换”模式。 输入XML <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p>Bunch of nested tags</w:p> <w:p>Bunch of nested tags to delete</w:p> <w:p>Bunch of nested tags to delete</w:p> <w:tbl>Bunch of nested tags to delete</w:tbl> <w:p>Bunch of nested tags</w:p> </w:body> </w:document> XSLT <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" standalone="yes"/> <xsl:strip-space elements="*"/> <!--Identity transform--> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="w:body/w:*[position() != 1 and position() != last()]"/> </xsl:stylesheet> 输出XML <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p>Bunch of nested tags</w:p> <w:p>Bunch of nested tags</w:p> </w:body> </w:document> Python import lxml.etree as lx # PARSE XML AND XSLT doc = lx.parse("Input.xml") style = lx.parse("Style.xslt") outfile = "Output.xml" # CONFIGURE AND RUN TRANSFORMER transformer = lx.XSLT(style) result = transformer(doc) # OUTPUT TO FILE with open(outfile, "wb") as f: f.write(result)
无法使用架构验证 XML,但可以通过从中读取写入的文件来工作
我目前正在使用 lxml 并想要验证 XML 内容。 我从 tei = etree.Element("TEI", nsmap={None: 'http://www.tei-c.org/ns/1.0'} 完全用 Python 编写,有很多子元素...
我想使用 XPath 表达式通过 lxml 解析 HTML。我的问题是匹配标签的内容: 例如给定 示例 元素我可以...
使用 lxml.objectify 替换节点文本,同时保留属性
像这样使用lxml.objectify: 从 lxml 导入对象化 o = objectify.fromstring("oldtext") o.b = '新文本' 结果新...
我一直在尝试部署一个需要 zeep[xmlsec] 才能工作的 lambda 函数,但此时我无法安装 xmlsec 要求,因为我正在尝试部署一个查询肥皂的 lambda
Python XMLSyntaxError:需要开始标记,'<' not found, line 1, column 1
我正在尝试使用 lxml 读取 XML 文件,但我不断收到此错误: XMLSyntaxError:需要开始标记,'<' not found, line 1, column 1 my code: import lxml parser16= lxml.etree.XMLParser(
lxml.etree:需要开始标记,'<' not found, line 1, column 1
我想获取一些简单的 xml 文件并将它们一次性全部转换为 CSV(尽管此代码一次只适用于一个)。在我看来,好像没有官方名称空间,但我不确定。 我...
我在我的Mac上安装了一个lxml,当我像这样输入python时 本地主机:lxml-3.0.1 苹果$ python Python 2.7.3(v2.7.3:70274d53c1dd,2012 年 4 月 9 日,20:52:43) [GCC 4.2.1(Apple Inc. build 5666)...
lxml 导入失败,错误“在平面命名空间‘_xsltDocDefaultLoader’中找不到符号”
使用代码: 从 lxml.etree 导入 HTML、XML 我得到回溯: 回溯(最近一次调用最后一次): 文件“/Users/username/code/project/lxml-test.py”,第 3 行,位于 ...
在 Django 视图中签名 XML 会为新建的 docker 镜像呈现 Nginx 502 错误网关,但不会为旧镜像呈现
我的 Django 应用程序的所有视图都按预期工作,与签名 XML 相关的视图除外。 在新 Ub 上运行时,这些视图(特别是我的 SAML 元数据视图)返回 502 Bad Gateway 错误...
我尝试在 AWS Lambda 中运行使用 lxml 库的 Python 脚本,但遇到导入错误: 回复 { "errorMessage": "无法导入模块 'lambda_functi...