web-dev-qa-db-ja.com

BeautifulSoupを使用して属性に基づいて画像srcを抽出する

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'))
8
user1217709

あなたはもうすぐそこにいます-ほんの2、3の間違い。 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() は組み込み関数であり、それらをマスクすることは悪い習慣であるため、idを_film_id_に変更しました。

10
Zero Piraeus

あなたの例は非常に近いと思います。 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'])
5
David Maust

私が正しく理解していれば、あなたは画像の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:を追加する必要がありました。

それが役に立てば幸い!

2
Pablo Ruiz Ruiz