Получить документ DOCTYPE с помощью BeautifulSoup

Я только начал работать с scrapy в сочетании с BeautifulSoup, и мне интересно, не упустил ли я что-то очень очевидное, но я не могу понять, как получить тип документа возвращаемого html-документа из полученного супового объекта.

Учитывая следующий html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en"> 
<head> 
<meta charset=utf-8 />
<meta name="viewport" content="width=620" />
<title>HTML5 Demos and Examples</title> 
<link rel="stylesheet" href="/css/html5demos.css" type="text/css" /> 
<script src="js/h5utils.js"></script> 
</head> 
<body>
<p id="firstpara" align="center">This is paragraph <b>one</b>
<p id="secondpara" align="blah">This is paragraph <b>two</b>.
</html>

Может ли кто-нибудь сказать мне, есть ли способ извлечь из него объявленный тип документа с помощью BeautifulSoup?


person Steerpike    schedule 23.03.2010    source источник


Ответы (3)


Beautiful Soup 4 имеет класс для объявлений DOCTYPE, поэтому вы можете использовать его для извлечения всех объявлений на верхнем уровне (хотя вы, несомненно, ожидаете либо одного, либо ни одного!)

def doctype(soup):
    items = [item for item in soup.contents if isinstance(item, bs4.Doctype)]
    return items[0] if items else None
person rptb1    schedule 02.06.2013

Вы можете пройтись по элементам верхнего уровня и проверить каждый, чтобы увидеть, является ли он объявлением. Затем вы можете проверить его, чтобы узнать, что это за декларация:

for child in soup.contents:
    if isinstance(child, BS.Declaration):
        declaration_type = child.string.split()[0]
        if declaration_type.upper() == 'DOCTYPE':
            declaration = child
person zvone    schedule 31.03.2011

Вы можете просто получить первый элемент в содержимом супа:

>>> soup.contents[0]
u'DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"'
person miles82    schedule 23.03.2010
comment
будьте осторожны, этот синтаксис сломается, если тип документа не является первым элементом. Например, когда в верхней части документа есть объявление xml. - person karlcow; 21.11.2010
comment
Это может вернуть что угодно, потому что doctype может отсутствовать, и это часто бывает. - person zvone; 31.03.2011