我正在尝试从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此外,在一般情况下使用findAll
和findChildren
与此特定情况之间有区别吗?这两个看起来和我一样..
答案 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 。