-3

次のような html Web ページがあるとします。

<html>
    <div id="a">
        <div class="aa">
            <p>
                <a id="ff" href="#">ff</a>
                <a id="gg" href="#">gg</a>
            </p>
        </div>
        <div class="bb">
            <p>
                <a id="ff" href="#">ff</a>
            </p>
        </div>
    </div>
    <div id="b">
    </div>
</html>

使用後

soup = BeautifulSoup(webpage.read())

HTML Web ページがあり、ツリー構造の下にあるリンクを取得したいと思います: <html>-> <div id="a">-> <div class="aa">

Beautiful Soup を使用して次の Python コードを作成するにはどうすればよいですか?

4

3 に答える 3

2

データに関する詳細情報がなければ、考えられるすべての入力をカバーする簡潔なソリューションを提供することは困難です。途中であなたを助けるために、ここにウォークスルーがあり、あなたのニーズに合った解決策につながることを願っています.

次のようになります<div id="a">(特定の ID を持つ要素は 1 つだけである必要があります)。

top_div = soup.find('div', {'id':'a'})

次に、すべての内部 div の取得に進むことができますclass='aa'(複数ある可能性があります)。

aa_div = top_div.findAll('div', {'class':'aa'})

そこから、見つかった各 div のすべてのリンクを返すことができます。

links = [div.findAll('a') for div in aa_div]

は見つかったノードのリストを返すlinksため、ネストされたリストが含まれていることに注意してください。このようなリストを平坦化するには、さまざまな方法があります。div.findAll('a')a

リストを繰り返し処理し、個々のリンクを出力する例を次に示します。

>>> from itertools import chain
>>> for a in chain.from_iterable(links):
...   print a
... 
<a id="ff" href="#">ff</a>
<a id="gg" href="#">gg</a>

上に示した解決策は、かなり長い道のりです。ただし、入力データをより深く理解することで、よりコンパクトなソリューションが可能になります。たとえば、データがあなたが示したとおりであり、常にそのデータが存在する場合divclass='aa'ソリューションは次のようになります。

>>> soup.find('div', {'class':'aa'}).findAll('a')
[<a id="ff" href="#">ff</a>, <a id="gg" href="#">gg</a>]

BeautifulSoup4 での CSS セレクターの使用

新しいバージョンの BeatifulSoup (バージョン 4) を使用している場合は、CSS セレクターのサポートを提供する.select()メソッドを使用することもできます。この回答の冒頭で提供した精巧なソリューションは、次のように書き直すことができます。

soup.select("div#a div.aa a")

BeautifulSoup v3 では、soupselectを使用してこの機能を追加できます。

ただし、ドキュメントからの次のステートメントに注意してください(強調は私のものです):

これは、CSS セレクター構文を知っているユーザーにとって便利です。これらすべてを Beautiful Soup API で行うことができます。また、必要なのが CSS セレクターだけである場合は、lxml を直接使用することもできます。その方が高速だからです。しかし、これにより、単純な CSS セレクターを Beautiful Soup API と組み合わせることができます。

于 2012-08-28T09:25:16.423 に答える
2

美しいスープの公式ドキュメントで次の情報を見つけました。

for link in soup.find_all('a'):
    print(link.get('href'))
# http://example.com/elsie

ここで美しいスープの詳細を見ることができます: http://www.crummy.com/software/BeautifulSoup/bs4/doc/

よろしく

于 2014-12-26T14:21:57.167 に答える
2

私はこのようにそれについて行きます:

from BeautifulSoup import BeautifulSoup
import urllib

url = 'http://www.website.com'
file_pointer = urllib.urlopen(url)
html_object = BeautifulSoup(file_pointer)

link_list = []
links = html_object('div',{'class':'aa'})[0]('a')
for href in links:
    link_list.append(href['href'])

これは、オフセットによって呼び出すことができる「リンク」のリストを返します。

link_1 = link_list[0]
link_2 = link_list[1]

あるいは、リンクに関連付けられたテキストが必要な場合 (つまり、'ここをクリック' と '/Product/Store/Whatever.html' のどちらか) が必要な場合は、この同じコードをわずかに変更して、目的の結果を生成することができます。

link_list = []
links = html_object('div',{'class':'aa'})[0]('a')
for text in links:
    link_list.append(text.contents[0])

繰り返しますが、これはリストを返すため、オフセットを呼び出す必要があります。

link_1_text = link_list[0]
link_2_text = link_list[1]
于 2012-08-30T14:56:01.343 に答える