也就是说,所有文本和子标签,没有元素本身的标签?
有
<p>blah <b>bleh</b> blih</p>
Run Code Online (Sandbox Code Playgroud)
我想要
blah <b>bleh</b> blih
Run Code Online (Sandbox Code Playgroud)
element.text返回"blah",etree.tostring(element)返回:
<p>blah <b>bleh</b> blih</p>
Run Code Online (Sandbox Code Playgroud) 我正在使用该xml.etree.ElementTree模块从另一个结构化文档中使用Python 3.1创建XML文档.
我可以使用哪个ElementTree函数返回现有子元素的索引?
我有以下代码片段:
from xml.etree.ElementTree import fromstring,tostring
mathml = fromstring(input)
for elem in mathml.getiterator():
elem.tag = 'm:' + elem.tag
return tostring(mathml)
Run Code Online (Sandbox Code Playgroud)
当我输入以下内容时input:
<math>
<a> 1 2 3 </a> <b />
<foo>Uitleg</foo>
<!-- <bar> -->
</math>
Run Code Online (Sandbox Code Playgroud)
它导致:
<m:math>
<m:a> 1 2 3 </m:a> <m:b />
<m:foo>Uitleg</m:foo>
</m:math>
Run Code Online (Sandbox Code Playgroud)
怎么会?我该如何保留评论?
编辑:我不关心使用的确切xml库,但是,我应该能够对标记进行粘贴更改.不幸的是,lxml似乎不允许这样(我不能使用正确的命名空间操作)
我试图在这个问题中使用答案,但无法使其工作:如何使用Python的ElementTree创建"虚拟根目录"?
这是我的代码:
import xml.etree.cElementTree as ElementTree
from StringIO import StringIO
s = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><!DOCTYPE tmx SYSTEM \"tmx14a.dtd\" ><tmx version=\"1.4a\" />'
tree = ElementTree.parse(StringIO(s)).getroot()
header = ElementTree.SubElement(tree,'header',{'adminlang': 'EN',})
body = ElementTree.SubElement(tree,'body')
ElementTree.ElementTree(tree).write('myfile.tmx','UTF-8')
Run Code Online (Sandbox Code Playgroud)
当我打开生成的'myfile.tmx'文件时,它包含以下内容:
<?xml version='1.0' encoding='UTF-8'?>
<tmx version="1.4a"><header adminlang="EN" /><body /></tmx>
Run Code Online (Sandbox Code Playgroud)
我错过了什么?或者,有更好的工具吗?
我想使用lxml解析HTML文档.我正在使用python 3.2.3和lxml 2.3.4(http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml)
我正在使用etree.iterparse解析文档,但它返回以下运行时错误:
Traceback (most recent call last):
File "D:\Eclipse Projects\Python workspace\Crawler\crawler.py", line 12, in <module>
for event, elements in etree.iterparse(some_file_like):
File "iterparse.pxi", line 491, in lxml.etree.iterparse.__next__ (src/lxml\lxml.etree.c:98565)
File "iterparse.pxi", line 512, in lxml.etree.iterparse._read_more_events (src/lxml\lxml.etree.c:98768)
TypeError: reading file objects must return plain strings
Run Code Online (Sandbox Code Playgroud)
问题是:如何解决这个运行时错误?
非常感谢你.
这是代码:
from io import StringIO
from lxml import etree
some_file_like = StringIO("<root><a>data</a></root>")
for event, elements in etree.iterparse(some_file_like): #<-- Run-time error happens here
print("%s, %4s, %s" % (event, elements.tag, elements.text))
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Python的ElementTree解析,操作和输出HTML:
import sys
from cStringIO import StringIO
from xml.etree import ElementTree as ET
from htmlentitydefs import entitydefs
source = StringIO("""<html>
<body>
<p>Less than <</p>
<p>Non-breaking space </p>
</body>
</html>""")
parser = ET.XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity.update(entitydefs)
etree = ET.ElementTree()
tree = etree.parse(source, parser=parser)
for p in tree.findall('.//p'):
print ET.tostring(p, encoding='UTF-8')
Run Code Online (Sandbox Code Playgroud)
当我在Mac OS X 10.6上使用Python 2.7运行时,我得到:
<p>Less than <</p>
Traceback (most recent call last):
File "bar.py", line 20, in <module>
print ET.tostring(p, encoding='utf-8')
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1120, in tostring
ElementTree(element).write(file, encoding, method=method)
File …Run Code Online (Sandbox Code Playgroud) 用这个python 2.7.3(或2.7.0)代码我想改变属性"android:versionCode ='2'"的值,它具有名称空间前缀"android":
#!/usr/bin/python
from xml.etree.ElementTree import ElementTree, dump
import sys, os
# Problem here:
ElementTree.register_namespace("android", "http://schemas.android.com/apk/res/android")
tree = ElementTree()
tree.parse("AndroidManifest.xml")
root = tree.getroot()
root.attrib["{http://schemas.android.com/apk/res/android}versionCode"] = "3"
dump(tree)
Run Code Online (Sandbox Code Playgroud)
如果不使用注释"Problem here"的代码行,ElementTree会自动将http://schemas.android.com/apk/res/android的名称空间别名命名为"ns0"(导致"ns0:versionCode = '3'".
因此,我使用ElementTree.register_namespace将命名空间url映射到别名"android",这将在此处记录.
我尝试这样做时得到的错误是:
AttributeError: type object 'ElementTree' has no attribute 'register_namespace'
Run Code Online (Sandbox Code Playgroud)
谁知道为什么这不起作用?这个方法应该在python 2.7中可用.
我有一个<root>具有多个属性的XML 元素.我一直在使用这个ElementTree包.
在我从xml文件中解析了一个树之后,我得到了文档根目录,但我希望得到所请求的属性,甚至是整个属性列表.
<root a="1" b="2" c="3">
</blablabla>
</root>
Run Code Online (Sandbox Code Playgroud)
如何<root>使用ElementTree 检索元素的所有属性名称和值?
我正在编写一个Python脚本来更新Visual Studio项目文件.它们看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
...
Run Code Online (Sandbox Code Playgroud)
以下代码读取然后写入文件:
import xml.etree.ElementTree as ET
tree = ET.parse(projectFile)
root = tree.getroot()
tree.write(projectFile,
xml_declaration = True,
encoding = 'utf-8',
method = 'xml',
default_namespace = "http://schemas.microsoft.com/developer/msbuild/2003")
Run Code Online (Sandbox Code Playgroud)
Python在最后一行抛出错误,说:
ValueError: cannot use non-qualified names with default_namespace option
Run Code Online (Sandbox Code Playgroud)
这是令人惊讶的,因为我只是在阅读和写作,中间没有编辑.Visual Studio拒绝加载没有默认命名空间的XML文件,因此省略它不是可选的.
为什么会出现此错误?建议或替代方案欢迎.
我正在尝试使用lxml和python第一次进行个人项目,我试图使用etree.strip_tags()从一些源代码中删除标签.
出于某种原因,我不断收到错误消息:"E1101:模块'lxml.etree'没有'strip_tags'成员'".
我不确定为什么会这样.
这是我的代码的相关部分:
from lxml import etree
...
DOC = etree.strip_tags(DOC_URL, 'html')
print DOC
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢.