質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Python

    9129questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Python3で画像収集したいのですがエラーが出ます。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,875

chrokurojp

score 20

Python使ってYahoo画像検索の画像を自動で収集してみた
http://tomoprog.hatenablog.com/entry/2016/02/13/024004

まとめサイトから画像をスクレイピングする[python]
http://www.mathgram.xyz/entry/scraping/matome

上記2つのサイトを参考にpythn3で画像収集したいのですが、同じエラーが出てしまいます。
同じ症状にあったかたいらっしゃいませんか

どうやらbeautyfulsoupが原因っぽい

ModuleNotFoundError: No module named 'html.entities'; 'html' is not a package

環境
python3 --version
Python 3.6.1

pip3 freeze | grep beautifulsoup
beautifulsoup4==4.5.3

【追加質問です。】
上記は解決しました。

下記を実行するとプログラムが置かれたフォルダ直下に保存される為、
f = open(os.path.basename("./static/"+resource), "wb")
と書き換えれば指定ディレクトリに保存できる考えたのですが
うまく行きませんでした。

アドバイスお願いします


「f = open("./static/"+os.path.basename(resource), "wb")」
にする事で解決できました

 web_crawler.py 

python3 web_crawler.py "https://search.yahoo.co.jp/image/search?ei=UTF-8&fr=sfp_as&aq=-1&oq=&ts=1609&p=%E8%B5%B0%E3%82%8C%EF%BC%81
%E3%80%80%E3%82%B3%E3%83%BC%E3%83%89%E5%AD%A6%E5%9C%92&meta=vc%3D" .jpeg,.jpg
#-*- coding:utf-8 -*-

import os
import sys
import time
import bs4
import urllib.request

def crawring(url, extensions):
    """
        Content:
            クローリング
        Param:
            url:        クローリングするURL
            extensions:    取得するリソースの拡張子(list)
    """
    # 指定したURLのHTMLを取得
    html = get_html_string(url)
    if len(html) < 1:
        print("HTMLが取得できませんでした。")
        print("URLを確認してください。")
        sys.exit(1)

    # リソース取得
    get_resource(html, extensions)

def get_resource(html, extensions):
    """
        Content:
            リソース取得
        Param
            html:        HTML
            extensions    拡張子のリスト
    """

    resource_list = []

    soup = bs4.BeautifulSoup(html,'lxml')
    for a_tag in soup.find_all("a"):
        href_str = a_tag.get("href")
        try:
            (path, ext) = os.path.splitext(href_str)
            if ext in extensions:
                resource_list.append(href_str)
        except:
            pass

    resource_list = sorted(set(resource_list), key=resource_list.index)
    for resource in resource_list:
        try:
            print("download ---> [%s]" % os.path.basename(resource))
            request = urllib.request.urlopen(resource)
            f = open(os.path.basename("./static/"+resource), "wb")
            f.write(request.read())
        except Exception as e:
            print(e)
            print("download failed ... [%s]" % os.path.basename(resource))
        finally:
            time.sleep(3)

def get_html_string(url):
    """
        Content:
            HTML取得
        Param:
            url    HTMLを取得するURL
    """
    decoded_html = ""

    # HTMLを取得
    try:
        request = urllib.request.urlopen(url)
        html = request.read()
    except:
        return decoded_html

    # エンコードを取得
    enc = check_encoding(html)
    if enc == None:
        return decoded_html

    # HTMLをデコード
    decoded_html = html.decode(enc)

    return decoded_html

def check_encoding(byte_string):
    """
        Content:
            文字コード確認
        Param:
            byte_string: バイト文字列
    """
    encoding_list = ["utf-8", "utf_8", "euc_jp", 
                    "euc_jis_2004", "euc_jisx0213", "shift_jis",
                    "shift_jis_2004","shift_jisx0213", "iso2022jp",
                     "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_3",
                    "iso2022_jp_ext","latin_1", "ascii"]

    for enc in encoding_list:
        try:
            byte_string.decode(enc)
            break
        except:
            enc = None

    return enc


def check_args():
    """
        Content:
            起動引数確認
    """
    if len(sys.argv) == 3:
        return True
    else:
        return False

def print_usage():
    print("Usage: %s URL Extensions" % __file__)
    print("URLにはクロールしたいウェブサイトのアドレスを指定してください。")
    print("Extensionsにはクロールしたときに取得するファイルの拡張子を指定してください。")
    print("Extensionsはカンマ区切りで複数指定できます。")

def main():
    """
        Content:
            main
    """
    # 引数確認
    if check_args() is False:
        print_usage()
        sys.exit(1)

    url = sys.argv[1]
    extensions = sys.argv[2].split(",")

    # クロール開始
    crawring(url, extensions)

if __name__ == "__main__":
    main()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tell_k

    2017/04/09 03:21

    エラーを再現できるような、最初のコード例があると回答がつきやすいです。少なくとも上記参考URLには「html.entities」を参照するようなコードは見当たりませんでした。

    キャンセル

  • yukkeorg

    2017/04/09 09:05

    追加質問以下の部分に関しましては、最初の質問とは異なるものですので、別途、「質問する」から質問してください。

    キャンセル

回答 1

checkベストアンサー

+1

ファイル名をhtml.pyにしていたり、カレントディレクトリにhtmlディレクトリがあったりしませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/09 05:58

    すいません。ファイル名をhtml.pyにしていました。

    キャンセル

同じタグがついた質問を見る

  • Python

    9129questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。