美化组:findAll recursive不

2024-06-16 11:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从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"))

为什么不起作用?

另外,在一般情况下和在这种特殊情况下使用findAllfindChildren有区别吗?在我看来这两个是一样的。。


Tags: text标记importdivcomfalse类型tag
1条回答
网友
1楼 · 发布于 2024-06-16 11:19:29

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

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

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

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

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

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

但是坚持使用实际的布尔值False,也会得到一个空的列表/结果集并返回给recursive=False,而不是像调用find撸u allnotfind那样没有。

相关问题 更多 >