Вы можете, выбрав тег head и зацикливая предыдущие элементы:
from bs4 import BeautifulSoup
from w3lib.html import remove_tags
html= '<?xml version="1.0" encoding="utf-8" standalone="no"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>'
soup= BeautifulSoup(html,"html.parser")
x= soup.head
while x.previous_element != None:
if not isinstance(x.previous_element, bs4.element.Tag):
p = x.previous_element.PREFIX + str(x.previous_element) +
x.previous_element.SUFFIX
prev_head = prev_head + p
else:
prev_head = str(x.previous_element) + prev_head
x = x.previous_element
prev_head = remove_tags(prev_head, which_ones= ("head",))
BeautifulSoup(prev_head)
После этого процесса у вас будет весь код выше <head>
в prev_head
в виде строки. Затем вы можете BeautifulSoup(prev_head)
чтобы получить объект BS для последующего использования.
PS: обратите внимание, что я удалил тег <head>
, потому что <html>
это первый previous_element
.Я также отформатировал элементы без тегов, потому что их формат flat str не включает их префикс и суффикс, что делает их недоступными для использования в объекте BS.