Beautifulsoup:findAll递归不起作用

时间:2016-08-07 18:34:54

标签: python web-scraping beautifulsoup

我正在尝试从wired.com获取文章。 一般来说,他们的文章内容看起来像这样:

<article itemprop="articleBody">
   <p>Some text</p>
   <p>Next text</p>
   <p>...</p>
   <p>...</p>
</article>

或者像这样:

<article itemprop="articleBody">
    <div class="listicle-captions marg-t...">
        <p></p>

    </div>

 </article>

所以我想如果页面类型为1,则提取<p><h>,而如果页面类型为2,则执行其他操作。因此,如果<p><h><article>的直接后代,那么它就是类型1。   我尝试了以下代码,它查找<p><h>并打印出标记名称。问题是,recursive="False"似乎没有帮助,因为在第2类页面上进行测试时,它会找到标签,而不应该(我认为它会获得NonType个对象)。

import urllib.request
from bs4 import BeautifulSoup
import datetime
import html
import sys

articleUrl="https://www.wired.com/2016/07/greatest-feats-inventions-100-years-boeing/"

soupArticle=BeautifulSoup(urllib.request.urlopen(articleUrl), "html.parser")

articleBody=soupArticle.find("article", {"itemprop":"articleBody"})
articleContentTags=articleBody.findAll(["h1", "h2","h3", "p"], recursive="False")

for tag in articleContentTags:
    print(tag.name)
    print(tag.parent.encode("utf-8"))

为什么不起作用?

PS此外,在一般情况下使用findAllfindChildren与此特定情况之间有区别吗?这两个看起来和我一样..

1 个答案:

答案 0 :(得分:2)

字符串文字"False"与使用布尔 False不同,您需要实际传递recursive=False

articleBody.find_all(["h1", "h2","h3", "p"], recursive=False)

任何非空字符串都将被视为真值,唯一可以传递的字符串是空字符串,即recursive=""

In [17]: bool("False")
Out[17]: True

In [18]: bool("foo")
Out[18]: True

In [19]: bool("")
Out[19]: False

但是坚持使用实际的布尔 False,你也会得到一个带有recursive=False的空列表/ ResultSet ,而不是您正在调用 find_all 而不是 find