web-dev-qa-db-ja.com

美しいスープとIDによるdivとそのコンテンツの抽出

soup.find("tagName", { "id" : "articlebody" })

なぜこれは<div id="articlebody"> ... </div>タグとその間のものを返さないのですか?何も返しません。そして、私はそれが存在することを知っています

soup.prettify()

soup.find("div", { "id" : "articlebody" })も機能しません。

編集:この投稿への回答はありません-どうすれば削除できますか? BeautifulSoupが正しく解析されていないことがわかりました。これはおそらく、解析しようとしているページがSGMLなどで適切にフォーマットされていないことを意味します。

121
Tony Stark

コードが正常に機能するため、サンプルドキュメントを投稿する必要があります。

>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div id="articlebody"> ... </div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>

<div>s内の<div>sの検索も同様に機能します。

>>> soup = BeautifulSoup.BeautifulSoup('<html><body><div><div id="articlebody"> ... </div></div></body></html')
>>> soup.find("div", {"id": "articlebody"})
<div id="articlebody"> ... </div>
168

idで要素を見つけるには:

div = soup.find(id="articlebody")
56
jfs

Beautiful Soup 4は、ほとんどの CSSセレクター.select()メソッド をサポートしているため、次のような id selector を使用できます。

soup.select('#articlebody')

要素のタイプを指定する必要がある場合は、idセレクターの前に type selector を追加できます。

soup.select('div#articlebody')

.select()メソッドは要素のコレクションを返します。つまり、次の .find_all() method の例と同じ結果を返します。

soup.find_all('div', id="articlebody")
# or
soup.find_all(id="articlebody")

単一の要素のみを選択したい場合は、単に .find() method を使用できます。

soup.find('div', id="articlebody")
# or
soup.find(id="articlebody")
12
Josh Crozier

「div」タグのネストが多すぎると問題があると思います。 Facebookのhtmlファイルからいくつかの連絡先を解析しようとしていますが、Beautifulsoupはタグ「div」とクラス「fcontent」を見つけることができません。

これは他のクラスでも発生します。一般的にdivを検索すると、それほどネストされていないdivのみになります。

Htmlソースコードは、あなたの友人(あなたの友人ではない)の友人リストのfacebookの任意のページです。誰かがそれをテストしてアドバイスを与えてくれたら、本当にありがたいです。

これは私のコードで、クラス「fcontent」でタグ「div」の数を印刷しようとしています。

from BeautifulSoup import BeautifulSoup 
f = open('/Users/myUserName/Desktop/contacts.html')
soup = BeautifulSoup(f) 
list = soup.findAll('div', attrs={'class':'fcontent'})
print len(list)
11
omar

ほとんどの場合、デフォルトのbeautifulsoupパーサーに問題があるためです。 「lxml」などの別のパーサーを変更して、再試行してください。

9
liang

Beautifulsoupソースでは、この行によりdivをdiv内にネストできます。そのため、ルカのコメントに対する懸念は無効になります。

NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']

あなたがする必要があると思うのは、あなたが望む属性を指定することです

source.find('div', attrs={'id':'articlebody'})
8
dagoof

soup.findAll("div", {"id": "articlebody"})を試しましたか?

クレイジーに聞こえますが、もしあなたが荒野からものを削っているなら、複数のdivを除外することはできません...

5
user106514

私が使用した:

soup.findAll('tag', attrs={'attrname':"attrvalue"})

Find/findallの構文として。つまり、タグと属性リストの間に他のオプションのパラメーターがない限り、これは異なるべきではありません。

4
user257111

Googleをスクレイプしようとしたときにも私に起こりました。
私はpyqueryを使用することになりました。
インストール:

pip install pyquery

つかいます:

from pyquery import PyQuery    
pq = PyQuery('<html><body><div id="articlebody"> ... </div></body></html')
tag = pq('div#articlebody')
4
Shoham

ここにコードの断片があります

soup = BeautifulSoup(:"index.html")
titleList = soup.findAll('title')
divList = soup.findAll('div', attrs={ "class" : "article story"})

ご覧のとおり、すべてのタグを見つけてから、class = "article"が含まれるすべてのタグを見つけます

3
Recursion