9

BeautifulSoup を使用して IMDb から HTML ページを取得しています。ページからポスター画像を抽出したいと考えています。属性の 1 つに基づいた画像を取得しましたが、その中のデータを抽出する方法がわかりません。

これが私のコードです:

url = 'http://www.imdb.com/title/tt%s/' % (id)
soup = BeautifulSoup(urllib2.urlopen(url).read())
print("before FOR")
for src in soup.find(itemprop="image"): 
    print("inside FOR")
    print(link.get('src'))
4

4 に答える 4

11

あなたはもうすぐそこにいます - ほんの数回の間違いです。soup.find()リストではなく、一致する最初の要素を取得するため、それを反復処理する必要はありません。要素を取得したら、src辞書アクセスを使用してその属性 ( など) を取得できます。ここに作り直されたバージョンがあります:

film_id = '0423409'
url = 'http://www.imdb.com/title/tt%s/' % (film_id)
soup = BeautifulSoup(urllib2.urlopen(url).read())
link = soup.find(itemprop="image")
print(link["src"])
# output:
http://ia.media-imdb.com/images/M/MV5BMTg2ODMwNTY3NV5BMl5BanBnXkFtZTcwMzczNjEzMQ@@._V1_SY317_CR0,0,214,317_.jpg

は組み込み関数であるため、に変更idしました。これらをマスクするのは悪い習慣です。film_idid()

于 2013-08-18T23:35:47.727 に答える
5

あなたの例は非常に近いと思います。find() の代わりに findAll() を使用する必要があり、反復するときに src から link に切り替えます。以下の例では、私はそれをに切り替えましたtag

このコードは、BeautifulSoup4 で機能しています。

url = 'http://www.imdb.com/title/tt%s/' % (id,)
soup = BeautifulSoup(urllib2.urlopen(url).read())
print "before FOR"
for tag in soup.findAll(itemprop="image"): 
    print "inside FOR"
    print(tag['src'])
于 2013-08-18T23:38:19.277 に答える
2

私が正しく理解している場合は、その後の抽出のために、画像のsrcを探しています。

まず、(インスペクターを使用して) HTML 内のどの位置に画像があるかを見つける必要があります。たとえば、サッカー チームの盾を解体するパーティクルのケースでは、次のものが必要でした。

m_url = 'http://www.marca.com/futbol/primera/equipos.html'
client = uOpen(m_url) 
page = client.read()
client.close()

page_soup = BS(page, 'html.parser')

teams = page_soup.findAll('li', {'id': 'nombreEquipo'})
for team in teams:
  name = team.h2.text
  shield_url = team.img['src']

次に、画像を処理する必要があります。オプションが必要です。

1番目: numpyを使用:

def url_to_image(url):
    '''
    Función para extraer una imagen de una URL
    '''
    resp = uOpen(url)
    image = np.asarray(bytearray(resp.read()), dtype='uint8')
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    return image

盾 = url_to_image(shield_url)

2番目のscikit-imageライブラリの使用(おそらくインストールする必要があります):

shield = io.imread('http:' + shield_url)

注:この特定の例では、最初に http: を追加する必要がありました。

それが役に立てば幸い!

于 2018-05-08T14:03:30.310 に答える