Как получить элемент из svg, используя xpath python lxml, но возвращая пустой список? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь отредактировать файл SVG с python-3 и lxml . Пока что я застрял на получении элемента из SVG с xpath.

from lxml import etree

boarder = etree.parse('boarder.svg')

Bd = boarder.xpath('//g/path')

print(Bd)

Когда я запускаю код, я получаю обратно:

[]

Какой пустой список. Я пытаюсь получить доступ к элементу g/path как к элементу, чтобы я мог изменить его атрибуты.

Это SVG, с которым я работаю ('boarder.svg') :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   id="svg8"
   version="1.1"
   viewBox="0 0 10 10"
   height="10mm"
   width="10mm">
  <defs
     id="defs2" />
  <metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     transform="translate(0,-287)"
     id="layer1">
    <path
       id="rect1379"
       d="m 1.1663527,287.97964 h 7.6672946 v 7.6673 H 1.1663527 Z"
       style="opacity:0.95;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
  </g>
</svg>

Пока я уже пробовал:

1 Ответ

1 голос
/ 08 июля 2019

Чтобы найти элемент svg, попробуйте следующий xpath. Использование local-name() или name()

from lxml import etree,html

boarder = etree.parse('boarder.svg')
Bd = boarder.xpath('//*[local-name()="svg"]//*[local-name()="g"]/*[local-name()="path"]/@id')[0]
print(Bd)
Bd = boarder.xpath('//*[local-name()="svg"]//*[local-name()="g"]/*[local-name()="path"]/@d')[0]
print(Bd)

ИЛИ

Bd = boarder.xpath('//*[name()="svg"]//*[name()="g"]/*[name()="path"]/@id')[0]
print(Bd)
Bd = boarder.xpath('//*[name()="svg"]//*[name()="g"]/*[name()="path"]/@d')[0]
print(Bd)

Вывод:

rect1379
m 1.1663527,287.97964 h 7.6672946 v 7.6673 H 1.1663527 Z
...