Редактирование SVG-файла (l xml) с красивой парой и регулярным выражением - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь создать скрипт, который изменяет файл .svg (XML формат). Я пытаюсь изменить цвет фона одного или нескольких объектов, таких как массив.

На данный момент я думаю, что прошел первую часть своего кода, но не вижу, как зарегистрировать мой изменение цвета.

Вот мой код:

From bs4 import BeautifulSoup
import re

svg = open('draw.svg').read()
soup = BeautifulSoup(svg ,'lxml')

paths = soup.find_all('path')

     for path in paths:
       if path.attrs['id']==('5'):
         print(path.attrs['style'])
         Str = re.sub( r'fill:#[0-9a-fA-F]{6}',
                       r'fil:#FFFFFF' ,
                       path.attrs['style'])
        path.attrs['style'] = Str
        print(Str)

    print(path.attrs['style'])
svg = open ('draw.svg' ,"w")
svg.write(paths)
svg.close()

то, что я хочу изменить, находится в теге пути, который содержит 4 различных атрибута (id, style ...). чтобы определить мой идентификатор, затем стиль, затем я помещаю регулярное выражение, которое я пытаюсь изменить, но оно ничего не меняет в исходном файле. Я думаю, что что-то упустил, вы можете помочь мне, посоветовав мне, как это сделать?

Я не вижу, как я могу читать / писать файл одновременно.

1 Ответ

0 голосов
/ 08 февраля 2020

Если я правильно понимаю, вы хотите отредактировать путь с помощью id='5'. Затем вы хотите изменить атрибут style, содержащий fill, на FFFFFF. Затем запишите это в файл. Вы можете сделать это:

from bs4 import BeautifulSoup
import re

# Opening files using the with statement is generally recommended
# because it ensures that open file descriptors are
# closed automatically after program execution leaves the context
# of the with statement
with open('draw.svg') as file:
    svg = file.read()

soup = BeautifulSoup(svg, 'lxml')

svg_tag = soup.find('svg')
path = svg_tag.find('path', {'id': '5'})
# There can be spaces between the fill and : and hex
# then either 1 or 2 groups of 3 alphanumeric characters.
# It can be multiline
path['style'] = re.sub(
    r'fill\s*:\s*#([a-fA-F0-9]{3}){1,2}',
    r'fill:#FFFFFF',
    path['style'],
    re.M
)

# print(soup)

# Open the file again using the with statement and write the svg tag contents.
with open('draw.svg', 'w') as file:
    file.write(str(svg_tag))

Вход (draw.svg):

<svg width="450" height="450">
   <path id="5" d="M100,100 L150,100 L150,150  Z"
      style="stroke: #0000cc;
             stroke-width: 2px;
             fill  : #ccccff;"/>
</svg> 

Выход (draw.svg):

<svg height="450" width="450">
<path d="M100,100 L150,100 L150,150  Z" id="5" style="stroke: #0000cc;
             stroke-width: 2px;
             fill:#FFFFFF;"></path>
</svg>
...