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'))
あなたはもうすぐそこにいます-ほんの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
_に変更しました。
あなたの例は非常に近いと思います。 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'])
私が正しく理解していれば、あなたは画像の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:を追加する必要がありました。
それが役に立てば幸い!