python - 当我运行 `for glyph in font.iter(' glyph')` 时,为什么 etree 没有从我的 SVG 中返回任何内容?

标签 python python-3.x svg lxml elementtree

目标

我是 Python 的新手。我想我会尝试编写一个脚本,使用 etree 从 SVG 图标文件中检索 glyph-nameunicode 以从中创建一个 LESS 文件。

暴力解决方案

我编写了一个解决方案,在该解决方案中,我遍历 SVG 元素以获取元素属性,将它们放入列表中,然后根据列表中的属性编写我的 LESS 样式。它看起来像这样:

SVG结构

<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><!--
2019-3-13: Created with FontForge (http://fontforge.org)
-->
<svg xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
    <metadata>
Created by FontForge 20170731 at Wed Mar 13 07:05:16 2019 By root
    </metadata>
    <defs>
        <font id="Flaticon" horiz-adv-x="512">
            <font-face font-family="Flaticon" font-weight="400" font-stretch="normal" units-per-em="512" panose-1="2 0 5 3 0 0 0 0 0 0" ascent="448" descent="-64" bbox="-0.00048785 -64.001 512 448" underline-thickness="25.6" underline-position="-51.2" unicode-range="U+0020-F131" />
            <missing-glyph />
            <glyph glyph-name="space" unicode=" " horiz-adv-x="200" />
            <glyph glyph-name="001-suitcase" unicode="&#xf100;" d="M487.934 315.467c13.2705 0 24.0664 -10.7959 24.0664 -24.0654v-281.637c0 -13.2695 -10.7959 -24.0654 -24.0664 -24.0654h-288.005c-4.1416 0 -7.5 3.35742 -7.5 7.5c0 4.1416 3.3584 7.5 7.5 7.5h164.539v17.3105
c0 0.0136719 -0.00195312 0.0263672 -0.00195312 0.0390625s0.00195312 0.0263672 0.00195312 0.0390625v83.5781h-17.3516c-4.14258 0 -7.5 3.3584 -7.5 7.5v82.835c0 4.1416 3.35742 7.5 7.5 7.5h17.3516v83.5771
c0 0.0126953 -0.00195312 0.0253906 -0.00195312 0.0390625c0 0.0126953 0.00195312 0.0253906 0.00195312 0.0390625v17.3105h-216.933v-100.965h17.3486c4.14258 0 7.5 -3.3584 7.5 -7.5v-82.835c0 -4.1416 -3.35742 -7.5 -7.5 -7.5h-17.3486v-100.967h22.4248
c4.1416 0 7.5 -3.3584 7.5 -7.5c0 -4.14258 -3.3584 -7.5 -7.5 -7.5h-145.891c-13.2705 0 -24.0664 10.7949 -24.0664 24.0654v41.3584c0 0.0195312 -0.00292969 0.0380859 -0.00292969 0.0576172s0.00292969 0.0380859 0.00292969 0.0585938v198.687
c0 0.0205078 -0.00292969 0.0380859 -0.00292969 0.0585938c0 0.0185547 0.00292969 0.0380859 0.00292969 0.0576172v41.3574c0 13.2695 10.7959 24.0654 24.0664 24.0654h41.3838c0.00976562 0 0.0185547 0.000976562 0.0292969 0.000976562
c0.00976562 0 0.0185547 -0.000976562 0.0283203 -0.000976562h91.873v58.7695c0 4.1416 3.3584 7.5 7.5 7.5h17.3516v9.06543c0 4.14258 3.35742 7.5 7.5 7.5h132.532c4.14258 0 7.5 -3.35742 7.5 -7.5v-9.06543h17.3506c4.1416 0 7.5 -3.3584 7.5 -7.5v-58.7686h91.8701
c0.00976562 0 0.0185547 0.000976562 0.0283203 0.000976562c0.0107422 0 0.0195312 -0.000976562 0.0292969 -0.000976562h41.3877zM114.401 300.467v-9.84961h18.1338v9.84961h-18.1338zM114.401 275.618v-76.1162h18.1338v76.1162h-18.1338zM15.0029 291.401v-33.3545
c21.8418 3.26855 39.1514 20.5781 42.4189 42.4199h-33.3525c-4.99902 0 -9.06641 -4.06641 -9.06641 -9.06543zM24.0693 0.701172h33.3525c-3.2666 21.8418 -20.5771 39.1523 -42.4189 42.4219v-33.3564c0 -5 4.06738 -9.06641 9.06641 -9.06543zM99.4014 18.0879v83.5781
h-17.3516c-4.1416 0 -7.5 3.3584 -7.5 7.5v82.835c0 4.1416 3.3584 7.5 7.5 7.5h17.3516v83.5771c0 0.0126953 -0.00195312 0.0253906 -0.00195312 0.0390625c0 0.0126953 0.00195312 0.0253906 0.00195312 0.0390625h0.000976562v17.3105h-26.8623
c-3.45312 -30.1211 -27.416 -54.085 -57.5371 -57.5381v-184.689c30.1221 -3.4541 54.085 -27.418 57.5371 -57.54h26.8613v17.3105c0 0.0136719 -0.00195312 0.0263672 -0.00195312 0.0390625s0.00195312 0.0263672 0.00195312 0.0390625zM132.535 0.700195v9.84961
h-18.1338v-9.84961h18.1338zM132.535 25.5498v76.1172h-18.1338v-76.1172h18.1338zM157.384 184.501h-67.834v-67.834h67.834v67.834zM304.917 383.302v-18.1338h9.85059v9.03906c0 0.00976562 -0.000976562 0.0185547 -0.000976562 0.0292969
c0 0.00976562 0.000976562 0.0185547 0.000976562 0.0283203v9.03711h-9.85059zM222.084 383.302v-18.1338h67.834v18.1338h-67.834zM197.235 383.302v-18.1338h9.84863v18.1338h-9.84863zM339.619 315.467v51.2686h-9.85059v-9.06836c0 -4.1416 -3.35742 -7.5 -7.5 -7.5
h-132.532c-4.14258 0 -7.5 3.3584 -7.5 7.5v9.06836h-9.85156v-51.2686h167.234zM379.469 300.467v-9.84961h18.1328v9.84961h-18.1328zM379.468 275.617v-76.1162h18.1328v76.1162h-18.1328zM354.617 116.666h67.834v67.835h-67.834v-67.835zM397.601 0.700195v9.84961
h-18.1328v-9.84961h18.1328zM397.602 25.5498v76.1172h-18.1328v-76.1172h18.1328zM496.999 9.76562v33.3623c-21.8447 -3.26758 -39.1572 -20.582 -42.4229 -42.4277h33.3574c4.99902 0 9.06641 4.06641 9.06543 9.06543zM497 58.2471v184.682
c-30.123 3.45215 -54.0869 27.416 -57.54 57.5381h-26.8584v-100.965h17.3496c4.1416 0 7.5 -3.3584 7.5 -7.5v-82.835c0 -4.1416 -3.3584 -7.5 -7.5 -7.5h-17.3496v-100.966h26.8574c3.4502 30.126 27.416 54.0938 57.541 57.5459zM497 258.046v33.3555
c0 4.99902 -4.06738 9.06543 -9.06641 9.06543h-33.3564c3.26855 -21.8428 20.5801 -39.1523 42.4229 -42.4209zM140.033 174.652c4.1416 0 7.5 -3.3584 7.5 -7.5v-33.1348c0 -4.1416 -3.3584 -7.5 -7.5 -7.5h-33.1338c-4.14258 0 -7.5 3.3584 -7.5 7.5v33.1348
c0 4.1416 3.35742 7.5 7.5 7.5h33.1338zM132.533 141.518v18.1348h-18.1338v-18.1348h18.1338zM405.1 174.652c4.14258 0 7.5 -3.3584 7.5 -7.5v-33.1348c0 -4.1416 -3.35742 -7.5 -7.5 -7.5h-33.1338c-4.1416 0 -7.5 3.3584 -7.5 7.5v33.1348c0 4.1416 3.3584 7.5 7.5 7.5
h33.1338zM397.6 141.518v18.1348h-18.1338v-18.1348h18.1338zM245.676 229.293c1.53516 -2.30078 1.67773 -5.25977 0.373047 -7.69922c-1.30469 -2.4375 -3.84668 -3.96094 -6.61328 -3.96094h-66.2666c-2.76562 0 -5.30664 1.52344 -6.6123 3.96094
c-1.30469 2.43945 -1.16309 5.39844 0.37207 7.69922l33.1318 49.7002c1.39062 2.08691 3.73242 3.33984 6.24023 3.33984c2.50684 0 4.84961 -1.25293 6.24023 -3.33887zM187.182 232.634h38.2402l-19.1211 28.6797zM305.701 83.5381c4.1416 0 7.5 -3.3584 7.5 -7.5
v-49.7051c0 -4.1416 -3.3584 -7.5 -7.5 -7.5h-82.834c-4.14258 0 -7.5 3.3584 -7.5 7.5v49.7051c0 4.1416 3.35742 7.5 7.5 7.5h82.834zM298.201 33.832v34.7051h-67.834v-34.7051h67.834z" />
            <glyph glyph-name="036-travel-trailer" unicode="&#xf123;" d="M156.601 290.617c4.14258 0 7.5 -3.35742 7.5 -7.5v-82.833c0 -4.14355 -3.35742 -7.5 -7.5 -7.5h-99.3994c-4.14258 0 -7.5 3.35645 -7.5 7.5v57.9434c0 0.0136719 -0.00195312 0.0253906 -0.00195312 0.0380859c0 0.0136719 0.00195312 0.0263672 0.00195312 0.0390625
v24.8125c0 4.14258 3.35742 7.5 7.5 7.5h99.3994zM149.101 207.784v42.9814h-84.3994v-42.9814h34.6982v9.06445c0 4.14355 3.35742 7.5 7.5 7.5c4.1416 0 7.5 -3.35645 7.5 -7.5v-9.06445h34.7012zM149.102 265.766v9.85156h-84.3994v-9.85156h84.3994zM328.066 195.529
c-1.42578 -1.7373 -3.55371 -2.74512 -5.80078 -2.74512h-132.531c-4.14258 0 -7.5 3.35742 -7.5 7.5v82.833c0 4.14258 3.35742 7.5 7.5 7.5h115.967c3.57617 0 6.6543 -2.52344 7.35449 -6.0293l4.95605 -24.7852
c0.00390625 -0.0175781 0.00683594 -0.0361328 0.0117188 -0.0537109l11.5977 -57.9941c0.439453 -2.20312 -0.129883 -4.48926 -1.55469 -6.22559zM197.234 275.617v-9.85156h104.289l-1.9707 9.85156h-102.318zM263.5 207.784h49.6182l-8.59473 42.9814h-107.288v-42.9814
h51.2646v9.06445c0 4.14355 3.3584 7.5 7.5 7.5s7.5 -3.35645 7.5 -7.5v-9.06445zM73.7666 124.951c4.14258 0 7.5 -3.35742 7.5 -7.5v-33.1328c0 -4.14355 -3.35742 -7.5 -7.5 -7.5h-33.1338c-4.1416 0 -7.5 3.35645 -7.5 7.5v33.1328c0 4.14258 3.3584 7.5 7.5 7.5
h33.1338zM66.2666 91.8184v18.1328h-18.1338v-18.1328h18.1338zM189.736 91.8184c22.4033 0 40.6318 -18.2275 40.6318 -40.6338c0 -22.4033 -18.2275 -40.6318 -40.6318 -40.6318c-22.4053 0 -40.6328 18.2275 -40.6328 40.6318c0 22.4053 18.2285 40.6338 40.6328 40.6338
zM189.736 25.5518c14.1328 0 25.6318 11.498 25.6318 25.6318c0 14.1348 -11.498 25.6338 -25.6318 25.6338c-14.1348 0 -25.6328 -11.499 -25.6328 -25.6338c0 -14.1338 11.499 -25.6318 25.6328 -25.6318zM504.5 91.8184c4.1416 0 7.5 -3.35742 7.5 -7.50195v-33.1338
c0 -4.14258 -3.3584 -7.5 -7.5 -7.5h-17.3496v-9.06543c0 -4.14355 -3.3584 -7.5 -7.5 -7.5c-4.14258 0 -7.5 3.35645 -7.5 7.5v9.06543h-17.3506c-4.1416 0 -7.5 3.35742 -7.5 7.5v9.06641h-52.4678c-3.16016 -9.6084 -12.2119 -16.5664 -22.8633 -16.5664
l-108.845 0.000976562c-1.72949 -17.0488 -9.29785 -32.3896 -20.6562 -44.0146c-0.176758 -0.222656 -0.365234 -0.44043 -0.571289 -0.646484c-0.207031 -0.206055 -0.424805 -0.394531 -0.647461 -0.571289c-13.3057 -13.001 -31.4854 -21.0361 -51.5137 -21.0361
c-20.0312 0 -38.2119 8.03711 -51.5186 21.041c-0.22168 0.175781 -0.436523 0.363281 -0.641602 0.568359c-0.205078 0.204102 -0.392578 0.420898 -0.568359 0.642578c-11.3604 11.624 -18.9307 26.9668 -20.6602 44.0176h-92.2803
c-13.2705 0 -24.0664 10.7969 -24.0664 24.0674v248.498c0 13.2715 10.7959 24.0664 24.0664 24.0664h42.2002v18.1338h-25.6338c-4.1416 0 -7.5 3.35645 -7.5 7.5v33.1338c0 4.14258 3.3584 7.5 7.5 7.5h36.2969c4.14258 0 7.5 -3.35742 7.5 -7.5s-3.35742 -7.5 -7.5 -7.5
h-28.7969v-18.1338h233.501v18.1338h-174.734c-4.14258 0 -7.5 3.35742 -7.5 7.5s3.35742 7.5 7.5 7.5h182.234c4.14258 0 7.5 -3.35742 7.5 -7.5v-33.1338c0 -4.14355 -3.35742 -7.5 -7.5 -7.5h-25.6318v-18.1318h25.6318c47.5664 0 87.165 -37.1494 90.1523 -84.5742
c0.136719 -1.78711 5.12109 -57.3945 10.082 -112.673v-0.00488281c2.16992 -24.1826 4.33496 -48.292 6.08887 -67.8145h51.8428v9.06641c0 4.14258 3.3584 7.5 7.5 7.5h17.3506v1.56445h-0.783203c-4.14258 0 -7.5 3.35742 -7.5 7.5c0 4.14355 3.35742 7.5 7.5 7.5
h16.5664c4.14258 0 7.5 -3.35645 7.5 -7.5c0 -4.14258 -3.35742 -7.5 -7.5 -7.5h-0.783203v-1.56445h17.3496zM81.2666 358.45v-18.1338h167.236v18.1338h-26.4189v-0.783203c0 -4.14258 -3.3584 -7.5 -7.5 -7.5s-7.5 3.35742 -7.5 7.5v0.783203h-34.7002v-0.783203
c0 -4.14258 -3.35742 -7.5 -7.5 -7.5c-4.1416 0 -7.5 3.35742 -7.5 7.5v0.783203h-34.6992v-0.783203c0 -4.14258 -3.35742 -7.5 -7.5 -7.5c-4.1416 0 -7.5 3.35742 -7.5 7.5v0.783203h-26.418zM15 316.25v-141.599h241.001c2.50781 0 4.84863 -1.25293 6.24023 -3.34082
l14.3408 -21.5107h97.1211c-4.50781 50.2412 -9.32227 103.961 -9.38672 104.997c-2.49121 39.5439 -35.5156 70.5195 -75.1826 70.5195h-265.067c-4.99902 0 -9.06641 -4.06738 -9.06641 -9.06641zM15 159.651v-9.85156h224.434
c2.50879 0 4.84961 -1.25293 6.24023 -3.33984l14.3408 -21.5117h115.918c-0.290039 3.22852 -0.584961 6.52051 -0.883789 9.85156h-102.481c-2.50879 0 -4.84961 1.25293 -6.24023 3.33984l-14.3398 21.5117h-236.987zM247.717 43.6855c-4.1416 0 -7.5 3.35742 -7.5 7.5
c0 4.14355 3.3584 7.5 7.5 7.5h0.289062c-1.35547 10.5986 -5.54102 20.3193 -11.7803 28.3838l-0.186523 -0.1875c-1.46387 -1.46387 -3.38379 -2.19629 -5.30273 -2.19629s-3.83887 0.732422 -5.30371 2.19629c-2.92871 2.92871 -2.92871 7.67676 0 10.6074
l0.1875 0.185547c-8.06445 6.23926 -17.7852 10.4238 -28.3828 11.7812v-0.288086c0 -4.14258 -3.3584 -7.5 -7.5 -7.5c-4.14258 0 -7.5 3.35742 -7.5 7.5v0.288086c-10.5996 -1.35645 -20.3203 -5.54102 -28.3848 -11.7793l0.1875 -0.186523
c2.92871 -2.92969 2.92871 -7.67676 0 -10.6074c-1.46387 -1.46289 -3.38379 -2.19629 -5.30273 -2.19629s-3.83887 0.732422 -5.30371 2.19629l-0.1875 0.188477c-6.23926 -8.06543 -10.4248 -17.7861 -11.7852 -28.3818h0.290039c4.1416 0 7.5 -3.35742 7.5 -7.5
s-3.3584 -7.5 -7.5 -7.5h-0.291016c1.35742 -10.5996 5.54199 -20.3203 11.7812 -28.3857l0.188477 0.189453c2.92871 2.92773 7.67773 2.92773 10.6064 0c2.92871 -2.92871 2.92871 -7.67676 0 -10.6074l-0.189453 -0.188477
c8.06543 -6.23926 17.7861 -10.4248 28.3857 -11.7822v0.291016c0 4.14258 3.35742 7.5 7.5 7.5c4.1416 0 7.5 -3.35742 7.5 -7.5v-0.291016c10.5986 1.35742 20.3193 5.54199 28.3848 11.7812l-0.188477 0.1875c-2.92871 2.92969 -2.92871 7.67676 0 10.6074
c2.92969 2.92773 7.67871 2.92773 10.6074 0l0.188477 -0.189453c6.23926 8.06543 10.4248 17.7852 11.7812 28.3838h-0.289062zM371.969 58.6846c4.99902 0 9.06641 4.06836 9.06543 9.06641c0 0.313477 -0.015625 0.623047 -0.0449219 0.924805
c-0.00585938 0.0566406 -0.0126953 0.112305 -0.0175781 0.168945c-0.681641 7.5918 -2.03711 22.6768 -3.69141 41.1045h-121.279c-2.50781 0 -4.84961 1.25293 -6.24121 3.33984l-14.3398 21.5117h-220.42v-67.0488c0 -5 4.06738 -9.06738 9.06641 -9.06738h92.2812
c1.72949 17.0459 9.2959 32.3828 20.6504 44.0059c0.179688 0.226562 0.370117 0.447266 0.579102 0.65625c0.209961 0.208984 0.429688 0.400391 0.657227 0.579102c13.3047 12.9951 31.4785 21.0254 51.502 21.0254h0.000976562h0.000976562h0.00195312
c20.0186 -0.00195312 38.1904 -8.03027 51.4941 -21.0225c0.228516 -0.180664 0.452148 -0.373047 0.664062 -0.583984c0.210938 -0.210938 0.402344 -0.43457 0.583984 -0.664062c11.3486 -11.6221 18.9111 -26.9551 20.6406 -43.9951zM497 58.6846v18.1338h-34.7002
v-18.1338h34.7002z" />
        </font>
    </defs>
</svg>
from lxml import etree

filename = "font.svg"
tree = etree.parse(open(filename, 'r'))

# Brute Force Method: Iterate through everything and then iterate through attributes.
for element in tree.iter():
    attributes = []

    for name, value in element.attrib.items():
        if (name == "glyph-name") or (name == "unicode"):
            attributes.insert(0, value)

    if type(attributes) != 'bool' and len(attributes) == 2:

        lessPreStyle += '''\
            .icon-{name} {{
                &:before {{
                    content: {unicode};
                }}
            }}
            '''.format(name=attributes[0], unicode=repr(attributes[1]).replace('\\u', '\\'))

优雅的解决方案

现在我试图通过仅遍历字形而不是每个元素并直接从对象获取属性而不是遍历属性来检查它是否被称为 glyph-nameunicode。到目前为止,我有这样的事情:

# Go directly to the parent of the glyphs
font = tree.getroot()[1][0]

# Filter only glyphs
for glyph in font.iter('glyph'):
    print (glyph.attrib['unicode'])
    print (glyph.attrib['glyph-name'])

我当前的问题是 for glyph in font.iter('glyph') 不返回任何内容。根据Python 3.6.8 Documentation我应该能够通过在 iter() 函数中输入我想要的子元素的名称来过滤子元素。但是,我什么也没得到。如果我删除过滤器并只打印子项的标签名称,我将获得所有标签名称。我不想像上次那样迭代和检查单个元素。我在这里错过了什么吗?或者是否有更好的方法来实现相同的目标?

最佳答案

您的 SVG 有一个默认命名空间 (http://www.w3.org/2000/svg)。

要在 iter() 中指定命名空间,您必须使用 Clark Notation。这基本上是命名空间 uri 和本地名称的组合:{http://www.w3.org/2000/svg}glyph

您还可以使用 * 而不是实际的命名空间 uri 来匹配任何命名空间中的元素:{*}glyph

参见 herehere了解更多信息。

例子:

from lxml import etree

tree = etree.parse("font.svg")

# Filter only glyphs
for glyph in tree.iter('{http://www.w3.org/2000/svg}glyph'):
    print(glyph.attrib['unicode'])
    print(glyph.attrib['glyph-name'])

关于python - 当我运行 `for glyph in font.iter(' glyph')` 时,为什么 etree 没有从我的 SVG 中返回任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55385936/

相关文章:

python - 在 numpy 数组上运行 Tensorflow classify_image

python - 用迭代器创建列表会产生意想不到的结果

python - 使用 cx_freeze 将 py2exe setup.py 文件转换为一个文件

Python 串行模块打印空行

python - 将模型函数传递给 GeoDjango 中的 geojson 序列化程序

python - 在 Ubuntu 上使用 PyGObject 在 python 中进行 Gtk 拼写检查

python-3.x - 在 Keras 中使用单热编码创建模型

php - mPDF 中的 SVG(PHP 库)

svg - 是否可以在 svg 矩形中设置负宽度?

java - 使用 Apache Batik 从 SVG 生成 JPG