我正在尝试从 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/