2010-03-23 18 views
7

के साथ दस्तावेज़ DOCTYPE प्राप्त करें मैंने scrapy के साथ BeautifulSoup के संयोजन के साथ टिंकरिंग शुरू कर दी है और मुझे आश्चर्य है कि मुझे कुछ बहुत याद आ रही है लेकिन मुझे यह पता लगाना नहीं है कि कैसे लौटाया गया कार्यप्रणाली प्राप्त करें परिणामी सूप ऑब्जेक्ट से एचटीएमएल दस्तावेज़।सुंदर सूप

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

किसी को भी मुझे बता सकते हैं कि इसमें से घोषित doctype BeautifulSoup का उपयोग कर निकालने की कोई तरीका है:

निम्नलिखित एचटीएमएल को देखते हुए?

उत्तर

4

ब्यूटीफुल सूप 4 DOCTYPE घोषणाओं के लिए एक वर्ग है, तो आप उसका प्रयोग शीर्ष स्तर पर सभी घोषणाओं को निकालने के लिए कर सकते हैं (आप कर रहे हैं, हालांकि कोई संदेह नहीं है कि एक या कोई नहीं!)

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

तुम सिर्फ सूप सामग्री में पहला आइटम लाने सकता है:

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

सावधान रहें, यह वाक्यविन्यास तोड़ देगा यदि कार्यप्रणाली पहली वस्तु नहीं है। उदाहरण के लिए, जब दस्तावेज़ के शीर्ष पर एक एक्सएमएल घोषणा होती है। – karlcow

+2

यह कुछ भी वापस कर सकता है, क्योंकि डॉक्टरेट गायब हो सकता है और यह अक्सर होता है। – zvone

3

आप शीर्ष स्तर के तत्वों के माध्यम से जाने के लिए और देखने के लिए कि क्या यह एक घोषणा है प्रत्येक देख सकते हैं। तो फिर तुम पता लगाने के लिए घोषणा की किस तरह यह है यह निरीक्षण कर सकते हैं:

for child in soup.contents: 
    if isinstance(child, BS.Declaration): 
     declaration_type = child.string.split()[0] 
     if declaration_type.upper() == 'DOCTYPE': 
      declaration = child 
संबंधित मुद्दे