2010-03-23 17 views
7

Je viens de commencer à bricoler avec scrapy en conjonction avec BeautifulSoup et je me demande si quelque chose me manque, mais je n'arrive pas à comprendre comment obtenir le doctype d'un retour document html de l'objet de soupe résultant.Obtenir le document DOCTYPE avec BeautifulSoup

avec le code HTML suivant:

<!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> 

Quelqu'un peut-il me dire s'il y a un moyen d'extraire le doctype déclaré de l'aide BeautifulSoup?

Répondre

4

Belle soupe 4 a une classe pour les déclarations de DOCTYPE, de sorte que vous pouvez utiliser pour extraire toutes les déclarations au plus haut niveau (si vous êtes sans doute en attendre un ou aucun!)

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

Vous pouvez tout simplement aller chercher le premier élément contenu soupe:

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

Soyez prudent, cette syntaxe se casse si le doctype n'est pas le premier élément. Par exemple, lorsqu'il y a une déclaration xml en haut du document. – karlcow

+2

Cela pourrait retourner n'importe quoi, car doctype pourrait être manquant et c'est souvent le cas. – zvone

3

Vous pouvez passer par des éléments de haut niveau et vérifier chaque pour voir si elle est une déclaration. Ensuite, vous pouvez l'inspecter pour savoir quel genre de déclaration, il est:

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