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
この特定の場合の違いはありますか?これらの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
ただし、実際のブール値 を使用することに固執します。また、find_all not findを呼び出しているため、Noneではなく、で返さFalse
れる空のリスト/ ResultSetを取得します。recursive=False
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加