Как удалить декларацию XML с помощью BeautifulSoup4
У меня есть файл XHTML, который имеет следующую структуру:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
...
</body>
<html>
Я использую BeautifulSoup и хочу удалить декларацию XML из документа, поэтому то, что у меня есть, выглядит так:
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
...
</body>
<html>
Я не могу найти способ получить объявление XML, чтобы удалить его. Насколько я могу судить, это не Doctype, Объявление, Тег или NavigableString. Есть ли способ найти это, чтобы извлечь его?
В качестве рабочего примера я могу удалить Doctype с помощью следующего кода (при условии, что текст документа является переменной "html"):
soup = BeautifulSoup(html)
[item.extract() for item in soup.contents if isinstance(item, Doctype)]
1 ответ
Решение
Вы можете использовать следующий подход:
import bs4
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
for e in soup:
if isinstance(e, bs4.element.ProcessingInstruction):
e.extract()
break
Вот что у меня сработало в некоторых очень простых случаях:
from bs4 import BeautifulSoup
s = "<a value='label'/>"
s = BeautifulSoup(s, 'xml')
print(s)
## <?xml version="1.0" encoding="utf-8"?>
## <a value="label"/>
с синтаксисом bs:
s.decode_contents() ## '<a value="label"/>'
с string.split:
str(s).split("\n")[-1] ## '<a value="label"/>'