установить XML значение атрибута с BeautifulSoup4 - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел бы прочитать, изменить и сохранить (переопределить) мой svg файл с BeautifulSoup в Python.

Содержимое bs-test.svg:

<g data-default-color="#FFFFFF" data-element-id="X123456">
  <rect class="selection-box" fill="none" height="91" stroke="none" width="140" x="-30" y="-10"/>
  <circle cx="40" cy="25" data-colored="true" fill="red" pointer-events="visible" r="25" stroke="black" stroke-width="3"/>
  <text fill="black" font-family="Verdana" font-size="16" text-anchor="middle" x="40" y="55">
    <tspan dy="16" x="40">Label Text</tspan>
  </text>
</g>

Содержимое фактически является подмножеством большего svg, где я нахожу g элементов на основе предоставленных пользователем значений data-element-id. Я хотел бы изменить атрибут fill элемента circle на "синий".

что у меня есть:

from bs4 import BeautifulSoup as bs

with open("bs-test.svg", "r") as f:
    contents = f.read()
    soup = bs(contents, "xml")

# grab g tags with the required data-element-id
elem_ls = soup.find_all(attrs={"data-element-id" : "X123456"})
x = elem_ls[0]
x

Вывод

<g data-default-color="#FFFFFF" data-element-id="X123456">
<rect class="selection-box" fill="none" height="91" stroke="none" width="140" x="-30" y="-10"/>
<circle cx="40" cy="25" data-colored="true" fill="red" pointer-events="visible" r="25" stroke="black" stroke-width="3"/>
<text fill="black" font-family="Verdana" font-size="16" text-anchor="middle" x="40" y="55">
<tspan dy="16" x="40">Label Text</tspan>
</text>
</g>

Я уверен, что это всего лишь вопрос синтаксиса, который я не могу найти ответьте на; как я могу go получить fill атрибут circle, заменить его значение на "синий" и записать?

Ответы [ 2 ]

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

в BeautifulSoup для перезаписи будет использоваться replace_with() метод

from bs4 import BeautifulSoup as bs

svg = """<g data-default-color="#FFFFFF" data-element-id="X123456">
  <rect class="selection-box" fill="none" height="91" stroke="none" width="140" x="-30" y="-10"/>
  <circle cx="40" cy="25" data-colored="true" fill="red" pointer-events="visible" r="25" stroke="black" stroke-width="3"/>
  <text fill="black" font-family="Verdana" font-size="16" text-anchor="middle" x="40" y="55">
    <tspan dy="16" x="40">Label Text</tspan>
  </text>
</g>
"""

soup = bs(svg, 'html.parser')
circle = soup.find('circle')
circle['fill'] = 'blue'
    soup.find('circle').replace_with(circle)
print(soup)
0 голосов
/ 13 февраля 2020

Вам просто нужно установить значение атрибута элемента bs4 с помощью ключа

КОД:

from bs4 import BeautifulSoup as bs

with open("bs-test.svg", "r") as f:
    contents = f.read()
    soup = bs(contents, "xml")

# grab g tags with the required data-element-id
elem_ls = soup.find_all(attrs={"data-element-id" : "X123456"})
for e in elem_ls:
    circle = e.find('circle')
    circle['fill'] = 'blue'

    print(e)

РЕЗУЛЬТАТЫ:

<g data-default-color="#FFFFFF" data-element-id="X123456">
<rect class="selection-box" fill="none" height="91" stroke="none" width="140" x="-30" y="-10"/>
<circle cx="40" cy="25" data-colored="true" fill="blue" pointer-events="visible" r="25" stroke="black" stroke-width="3"/>
<text fill="black" font-family="Verdana" font-size="16" text-anchor="middle" x="40" y="55">
<tspan dy="16" x="40">Label Text</tspan>
</text>
</g>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...