使用 BeautifulSoup 获取文档 DOCTYPE

Posted

技术标签:

【中文标题】使用 BeautifulSoup 获取文档 DOCTYPE【英文标题】:Get document DOCTYPE with BeautifulSoup 【发布时间】:2011-01-30 18:12:14 【问题描述】:

我刚刚开始修改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 从中提取声明的文档类型?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您可以遍历***元素并检查每个元素以查看它是否是声明。然后您可以检查它以找出它是哪种声明:

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

【讨论】:

【参考方案3】:

您可以只获取汤内容中的第一项:

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

【讨论】:

小心,如果文档类型不是第一项,则此语法将中断。例如,当文档顶部有 xml 声明时。 这可能会返回任何内容,因为 doctype 可能会丢失而且经常会丢失。

以上是关于使用 BeautifulSoup 获取文档 DOCTYPE的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 库

爬虫利器BeautifulSoup模块使用

使用 BeautifulSoup 获取文档 DOCTYPE

beautifulSoup《转》

BeautifulSoup文档1-简介安装和使用

爬虫—— BeautifulSoup模块获取元素