2010-03-23 31 views
7

Tôi vừa mới bắt đầu sửa đổi scrapy kết hợp với BeautifulSoup và tôi tự hỏi liệu tôi có thiếu điều gì đó hiển nhiên hay không nhưng tôi không thể tìm ra cách lấy lại tài liệu về tài liệu html từ đối tượng canh.Nhận tài liệu DOCTYPE với BeautifulSoup

Với html sau:

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

bất cứ ai có thể cho tôi biết nếu có một cách chiết xuất các loại tài liệu được công bố từ nó bằng cách sử BeautifulSoup?

Trả lời

4

Beautiful Soup 4 có một lớp cho tờ khai DOCTYPE, vì vậy bạn có thể sử dụng để trích xuất tất cả các tờ khai tại cấp cao nhất (mặc dù bạn không nghi ngờ gì là mong đợi một hoặc không!)

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

Bạn chỉ có thể lấy mục đầu tiên trong nội dung súp:

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

cẩn thận, cú pháp này sẽ phá vỡ nếu loại tài liệu không phải là mục đầu tiên. Ví dụ: khi có khai báo xml ở đầu tài liệu. – karlcow

+2

Điều đó có thể trả về bất cứ điều gì, bởi vì DOCTYPE có thể bị thiếu và thường là. – zvone

3

Bạn có thể đi qua các yếu tố cấp cao nhất và kiểm tra từng thấy cho dù đó là một tuyên bố. Sau đó, bạn có thể kiểm tra nó để tìm ra những loại tuyên bố nó là:

for child in soup.contents: 
    if isinstance(child, BS.Declaration): 
     declaration_type = child.string.split()[0] 
     if declaration_type.upper() == 'DOCTYPE': 
      declaration = child 
Các vấn đề liên quan