用Python解析SVG文件路径

用Python解析SVG文件路径,python,svg,Python,Svg,我正在从事一个机器人项目,从一个运行Android的设备上拍摄一张照片,然后发送到cloudconvert.org将其转换为SVG,然后所有SVG路径将转换为x y坐标,并串行发送到机器人手臂,机器人手臂将在笔打开或关闭的情况下绘制它们 我在这个项目中已经做了这么多,现在唯一的问题是将SVG文件解析为一个路径列表,作为一个字符串列表 我试过minidom,但似乎不起作用。实际上,我可以访问SVG文件,但我无法访问路径数据示例“M 100200 L 200.300”,而不是我得到的路径数据 >

我正在从事一个机器人项目,从一个运行Android的设备上拍摄一张照片,然后发送到cloudconvert.org将其转换为SVG,然后所有SVG路径将转换为x y坐标,并串行发送到机器人手臂,机器人手臂将在笔打开或关闭的情况下绘制它们

我在这个项目中已经做了这么多,现在唯一的问题是将SVG文件解析为一个路径列表,作为一个字符串列表

我试过minidom,但似乎不起作用。实际上,我可以访问SVG文件,但我无法访问路径数据示例“M 100200 L 200.300”,而不是我得到的路径数据

>>> from xml.dom import minidom
>>> xmldoc= minidom.parse("C:\Users\DELL\Desktop\drawing-1.svg")
>>> a=xmldoc.getElementsByTagName("svg")[0]
>>> b=a.getElementsByTagName("g")[0]
>>> pth=b.getElementsByTagName("path")[0]
>>> pth
<DOM Element: path at 0x1bb6238>

没有显示任何内容,只有两个空白行,然后再次显示。

我一直在处理同一个问题,我的解决方案是: 1.使用以下命令将svg路径转换为多边形 2.使用一个相对简单的python脚本来提取点列表。这是我的代码,可能有点混乱/不完善,但它完成了任务

scribble=open("scrib1.txt")
for line in scribble:
    if line.startswith("<polygon"):
        rightline=line.split('"')
commas=rightline[13].split(' ') 
newlist=[]
for i in commas:
    tup=i.split(',')
    newlist.append((tup[0],tup[1]))
scribble=open(“scribb1.txt”)
对于涂鸦中的线条:

if line.startswith(“这是一个旧线程,但由于来自接受答案的链接在这里不再起作用,因此我采用的是处理svg路径的方法

有一个svg.path模块,它提取路径和其他形状,并提供处理它们的方法

from xml.dom import minidom
from svg.path import parse_path

svg_dom = minidom.parseString(svg_string)

path_strings = [path.getAttribute('d') for path in svg_dom.getElementsByTagName('path')]

for path_string in path_strings:
    path_data = parse_path(path_string)

    #  now use methods provided by the path_data object
    #  e.g. points can be extracted using 
    #  point = path_data.pos(pos_val) 
    #  where pos_val is anything between 0 and 1

谢谢你帮我格式化我的帖子Nicolas:)你能发布一个SVG文件吗?或者至少有足够的文件可以让我们看到它的结构吗?文本“M 100..”等是路径的属性吗?试试pth['attrib_name'](无论名称是什么)如果要相信,你需要调用
pth.getAttribute('d'))
。我用记事本打开了我的svg文件,但属性d没有在braket中标记,就像这样“”
pip install svg.path
from xml.dom import minidom
from svg.path import parse_path

svg_dom = minidom.parseString(svg_string)

path_strings = [path.getAttribute('d') for path in svg_dom.getElementsByTagName('path')]

for path_string in path_strings:
    path_data = parse_path(path_string)

    #  now use methods provided by the path_data object
    #  e.g. points can be extracted using 
    #  point = path_data.pos(pos_val) 
    #  where pos_val is anything between 0 and 1