【问题标题】:Beautifulsoup: findAll recursive doesn't workBeautifulsoup:findAll 递归不起作用
【发布时间】:2016-08-07 18:34:54
【问题描述】:

我正在尝试从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,则提取 &lt;p&gt;&lt;h&gt;,而如果页面是类型 2 - 执行其他操作。所以,如果&lt;p&gt;&lt;h&gt;&lt;article&gt; 的直接后代,那么它就是类型1。 我尝试了以下代码,它查找&lt;p&gt;&lt;h&gt; 并打印出标签名称。问题是,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 和在这种特殊情况下有区别吗?这两个在我看来是一样的..

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    字符串文字"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
    

    但是坚持使用实际的 boolean False,你也会得到一个空的 list/ResultSet 返回 recursive=False,而不是你调用的 None find_all 不是 find

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多