美しいスープとdivとそのコンテンツをIDで抽出


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

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

soup.prettify()

soup.find("div", { "id" : "articlebody" }) また動作しません。

編集: BeautifulSoupがページを正しく解析していないことがわかりました。おそらく、解析しようとしたページがSGMLなどで正しくフォーマットされていないことを意味します)


(あなたの編集にとって、パーサーが特定のページで機能しない場合でも、この質問は他のユーザーにとって再利用可能なリソースとして価値があります)
smci

回答:


202

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

>>> 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>

2
私のサンプルドキュメントは巨大です。私は問題を追跡しています-これはdivのdivでは機能しないと思います。ドキュメントに含まれるdivの数を数えたところ、結果は10になったprint len(soup( 'div'))でした。Firebugを使用すると、はっきりと10を超えるdivを見ることができます。だから私はそれがdivの中にdivを見つけることができないと思うので、ラッパーでラッパーを絞り込む必要があります。
トニースターク

8
それでは、質問に答えることは不可能です。水晶玉はデバッグの信頼できる方法ではありません。:)
ルーカス・ラリンズキー

1
私はこのコードを試しました。divには<embed>があり、その中に埋め込みを印刷できません。
Vincent

13
またはもっと簡単にdiv = soup.find(id="articlebody")
jfs 2014

4
またはsoup.find('div', id='articlebody')
Trevor Boyd Smith

71

その要素を見つけるにはid

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

15

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

soup.select('#articlebody')

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

soup.select('div#articlebody')

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

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

単一の要素のみを選択する場合は、次の.find()メソッドを使用できます。

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

13

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

これは他のクラスでも発生します。一般的に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)

9

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


これはうまくいきました、ありがとう!私が使用したsoup = BeautifulSoup(data, parser="html.parser")
意志のハート

8

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

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

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

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

5

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

クレイジーに聞こえるかもしれませんが、野生のものをこすり落としている場合、複数のdivを除外することはできません...


4

私が使用した:

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

find / findallの構文として。ただし、タグと属性リストの間に他のオプションのパラメーターがない限り、これは同じであるべきです。


4

グーグルをこすり取ろうとしている間も私に起こりました。
私はpyqueryを使用してしまいました。
インストール:

pip install pyquery

使用する:

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

3

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

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

ご覧のとおり、すべてのタグを見つけてから、内部にclass = "article"を含むすべてのタグを見つけます


0

Idプロパティは常に一意に識別されます。つまり、要素を指定しなくても直接使用できます。したがって、コンテンツ全体を解析する要素がある場合は、それがプラスになります。

divEle = soup.find(id = "articlebody")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.