python - Beautifulsoup:findAll 递归不起作用

标签 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"))

为什么它不起作用?

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

最佳答案

字符串文字"False"与使用booleanFalse是不一样的,你需要实际传递recursive=错误:

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

但坚持使用实际的 bool 值 False,您还会得到一个空的 list/ResultSet 返回 recursive=False ,而不是 None,因为您调用的是 find_all 而不是 find

关于python - Beautifulsoup:findAll 递归不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38817300/

相关文章:

python - 人脸识别模型无法正确预测训练图像

Python匹配文件名并放入文件夹

python - scrapy蜘蛛绕过拒绝我的规则

ruby-on-rails - 使用 Mechanize 从 url 获取相关内容

Python:我的 except 子句确实太宽泛了吗?

python - 如何使用python将表单数据插入MYSQL

python - 如何使用理解来比较两个字典?

r - 使用 R 从 ftp 下载文件

python - 如何使用 BeautifulSoup 在 Python 中获取特定标签属性文本?

python - Web 抓取 html 加油站