2010-03-23 16 views
7

Acabo de comenzar a retocar con scrapy junto con BeautifulSoup y me pregunto si me falta algo muy obvio, pero parece que no puedo averiguar cómo obtener el tipo de documento de un devuelto documento html del objeto sopero resultante.Obtenga el documento DOCTYPE con BeautifulSoup

Dado el siguiente código 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> 

¿Puede alguien decirme si hay una manera de extraer el tipo de documento declarada de ella usando BeautifulSoup?

Respuesta

4

Hermosa sopa 4 tiene una clase de declaraciones DOCTYPE, por lo que puede usarlo para extraer todas las declaraciones en el nivel superior (aunque estás sin duda esperando uno o ninguno!)

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

Se podía ir a buscar el primer elemento de contenido sopa:

>>> soup.contents[0] 
u'DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"' 
+4

tenga cuidado, esta sintaxis se romperá si el doctype no es el primer elemento. Por ejemplo, cuando hay una declaración xml en la parte superior del documento. – karlcow

+2

Eso podría devolver algo, porque doctype podría faltar y a menudo lo es. – zvone

3

Puede ir a través de elementos de nivel superior y comprobar cada uno para ver si se trata de una declaración. A continuación, puede inspeccionarlo para averiguar qué tipo de declaración es:

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