代码之家  ›  专栏  ›  技术社区  ›  Steerpike

用漂亮的汤获取文档doctype

  •  7
  • Steerpike  · 技术社区  · 16 年前

    我刚开始修补 scrapy 与 BeautifulSoup 我想知道我是否遗漏了一些非常明显的东西,但是我似乎不知道如何从得到的soup对象中获取返回的HTML文档的doctype。

    给出以下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>
    

    有没有人能告诉我有没有一种方法可以用漂亮的汤从中提取声明的doctype?

    3 回复  |  直到 9 年前
        1
  •  4
  •   rptb1    13 年前

    BeautifulSoup4有一个用于doctype声明的类,因此您可以使用该类在顶层提取所有声明(尽管您肯定希望有一个或没有一个声明!)

    def doctype(soup):
        items = [item for item in soup.contents if isinstance(item, bs4.Doctype)]
        return items[0] if items else None
    
        2
  •  3
  •   zvone    15 年前

    您可以遍历顶级元素,并检查每个元素是否是声明。然后您可以检查它,找出它是什么类型的声明:

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

    您只需取汤中的第一项:

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