我一直在做一个项目,接收.svg文件并找到它们的维度。与其将它们转换为png,或者使用pysvg (Best way of Getting Swf File Dimensions with Python),我并不试图简单地扫描xml以获取维度。
我以前一直使用open("thefile").read(),我不明白为什么这段代码不能工作。我的行尸走肉有问题吗?
xml文件可能是什么样子的示例如下:
str: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" height="25.6px" width="74.9px" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0.5, 0.5)">
<path d="M71.3 0.15 Q73.9 0.75 73.9 4.0 L73.9 20.6 Q73.9 24.6 69.9 24.6 L4.0 24.6 Q0.9 24.6 0.2 22.2 L0.0 20.6 0.0 4.0 0.2 2.4 Q0.7 0.6 2.6 0.15 L4.0 0.0 69.9 0.0 71.3 0.15" fill="#ffffff" fill-rule="evenodd" stroke="none"/>
<path d="M71.3 0.15 L69.9 0.0 4.0 0.0 2.6 0.15 Q0.7 0.6 0.2 2.4 L0.0 4.0 0.0 20.6 0.2 22.2 Q0.9 24.6 4.0 24.6 L69.9 24.6 Q73.9 24.6 73.9 20.6 L73.9 4.0 Q73.9 0.75 71.3 0.15" fill="none" stroke="#8e8e8e" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.0"/>
</g>
</svg>发生错误的代码:
x=re.findall("width=\"[^\"]*",svgF)[0]我们找到了变量x,在这种情况下等于74.9px。这正是我一直在寻找的。我只是不知道这个错误是从哪里来的。如果我只允许错误发生,我想要的数据就会被提取出来。有什么想法吗?
错误:
错误评估: thread_id: pid54226_seq2 frame_id: 140505356028928作用域:表达式吸引: svgF跟踪(最近一次调用):resolveCompoundVariable返回resolver.getDictionary(var) AttributeError:'NoneType‘对象没有属性'getDictionary’
发布于 2014-06-20 00:50:15
SVG是XML文档,因此您应该为XML使用标准工具。在这些情况下,Regexps服务不太好。
下面的示例使用xpath和lxml库(首先安装它)
>>> xmlstr = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
... <svg xmlns:xlink="http://www.w3.org/1999/xlink" height="25.6px" width="74.9px" xmlns="http://www.w3.org/2000/svg">
... <g transform="matrix(1, 0, 0, 1, 0.5, 0.5)">
... <path d="M71.3 0.15 Q73.9 0.75 73.9 4.0 L73.9 20.6 Q73.9 24.6 69.9 24.6 L4.0 24.6 Q0.9 24.6 0.2 22.2 L0.0 20.6 0.0 4.0 0.2 2.4 Q0.7 0.6 2.6 0.15 L4.0 0.0 69.9 0.0 71.3 0.15" fill="#ffffff" fill-rule="evenodd" stroke="none"/>
... <path d="M71.3 0.15 L69.9 0.0 4.0 0.0 2.6 0.15 Q0.7 0.6 0.2 2.4 L0.0 4.0 0.0 20.6 0.2 22.2 Q0.9 24.6 4.0 24.6 L69.9 24.6 Q73.9 24.6 73.9 20.6 L73.9 4.0 Q73.9 0.75 71.3 0.15" fill="none" stroke="#8e8e8e" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.0"/>
... </g>
... </svg>"""
...
>>> from lxml import etree
>>> svg = etree.fromstring(xmlstr)
>>> svg
<Element {http://www.w3.org/2000/svg}svg at 0x7f7d180d2638>
>>> svg.xpath("//@width")
['74.9px']发布于 2014-06-20 01:12:42
不要在字符类中转义双引号。您需要给出一个只匹配74.9px的正则表达式,因为输入中有另一个width可用。
>>> import re
>>> xmlstr = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
... <svg xmlns:xlink="http://www.w3.org/1999/xlink" height="25.6px" width="74.9px" xmlns="http://www.w3.org/2000/svg">
... <g transform="matrix(1, 0, 0, 1, 0.5, 0.5)">
... <path d="M71.3 0.15 Q73.9 0.75 73.9 4.0 L73.9 20.6 Q73.9 24.6 69.9 24.6 L4.0 24.6 Q0.9 24.6 0.2 22.2 L0.0 20.6 0.0 4.0 0.2 2.4 Q0.7 0.6 2.6 0.15 L4.0 0.0 69.9 0.0 71.3 0.15" fill="#ffffff" fill-rule="evenodd" stroke="none"/>
... <path d="M71.3 0.15 L69.9 0.0 4.0 0.0 2.6 0.15 Q0.7 0.6 0.2 2.4 L0.0 4.0 0.0 20.6 0.2 22.2 Q0.9 24.6 4.0 24.6 L69.9 24.6 Q73.9 24.6 73.9 20.6 L73.9 4.0 Q73.9 0.75 71.3 0.15" fill="none" stroke="#8e8e8e" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.0"/>
... </g>
... </svg>"""
>>> x=re.findall(r' width="([^"]*)', xmlstr)
>>> x
['74.9px']https://stackoverflow.com/questions/24318372
复制相似问题