Красивый суп - как мы можем получить элементы перед элементом <head>?

Если у меня есть html, как показано ниже, и я использую красивый суп для его анализа, как мне получить доступ к строкам перед элементом <head>.

<?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.head или к телу - soup.body. Я предполагаю, что это потому, что head и body - стандартные теги.

Есть ли способ получить доступ к элементам до <head>?

Я бы предложил синтаксический анализатор XML поверх BS

Simon 13.09.2018 21:55
2
1
390
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете выбрать тег заголовка и перебрать предыдущие_элементы:

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. Я также отформатировал элементы без тегов, потому что их плоский формат str не включает их префикс и суффикс, что делает их недоступными для использования в объекте BS.

Другие вопросы по теме