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

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

ただいまの
回答率

90.52%

  • HTML

    8932questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Python

    7907questions

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

  • スクレイピング

    328questions

python スクレイピング BeautifulSoupのsoup.selectでid指定 とURLにひらがなが入る場合

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 154

pethagoras

score 7

 前提・実現したいこと

pythonのスクレイピングを勉強中です。
適当なサイトのリンクや文字列を抽出しながら勉強しています。

 発生している問題・エラーメッセージ

youtubeの動画のリンクを抽出しようとした所

  1.  <a>タグのidを上手く指定できずに困っています。
    soup.select("a") だとちゃんと抽出してくれるのですが,idを指定して
    soup.select("a#video-title")やクラスを指定しての
    soup.select("a.yt-simple-endpoint style-scope ytd-video-renderer")だと何もかえってきません  
    エラーが出る事なく処理は終了します。
    .

  2.  URLにひらがなが入るとurlopen()の所でエラーが出てしまいます。
      
    以下エラーコード
    Traceback (most recent call last):
    File "C:\ProgramData\Anaconda3\Scripts\sc3.py", line 19, in <module>
    html = req.urlopen(url)
    File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
    File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 526, in open
    response = self._open(req, data)
    File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 544, in _open
    '_open', req)
    File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
    File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
    File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
    File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
    File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1250, in _send_request
    self.putrequest(method, url, **skips)
    File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1117, in putrequest
    self._output(request.encode('ascii'))
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 26-27: ordinal not in range(128)

 該当のソースコード

from selenium import webdriver
import urllib.request as req
from bs4 import BeautifulSoup

driver = webdriver.Chrome("C:\ProgramData\Anaconda3\chromedriver")

driver.get("https://www.youtube.com/")

textbox = driver.find_element_by_id("search")
btn = driver.find_element_by_id("search-icon-legacy")

keyword = "dyson" #←ここがひらがなになるとエラーになります。

textbox.send_keys(keyword)
btn.click()

url = "https://www.youtube.com/results?search_query="+keyword
html = req.urlopen(url)

soup = BeautifulSoup(html,"html.parser")

date = soup.select("a#video-title")

for a in date:
      b = a.string
      c = a.attrs["href"] 

      print(b,"リンク→",c)

上記内容の対処法、ご教授下さい。
ご解答よろしくお願いします。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

Youtube利用規約よってスクレイピングを禁止しています。

4. 本サービスの一般的な利用--許可及び制限事項

C,お客様は、本サービス自体の動画再生ページ、Embeddable Player、又はその他YouTubeが明示的に認めた手段以外のあらゆる技術及び手段を通じて、 本コンテンツにアクセスしないことに合意します。

H,お客様は、人間が、標準的なオンライン・ウェブ・ブラウザを使用して、一定の時間内に合理的に生成しうるリクエスト・メッセージよりも多くのリクエスト・メッセージを同程度の時間内にYouTubeサーバに送信するような方法で、本サービスにアクセスする自動システム(「ロボット」、「スパイダー」又は「オフラインリーダー」を含みますが、これらに限られません。)を使用又は起動しないことに合意します。

代わりにYoutube Data APIを使用してくださいな。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/23 22:09

    ご解答ありがとうございます。

    なるほど、そもそも禁止だったんですね
    ご解答ありがとうございました。

    キャンセル

0

soup.select("a") だとちゃんと抽出してくれるのですが,idを指定して
soup.select("a#video-title")やクラスを指定しての
soup.select("a.yt-simple-endpoint style-scope ytd-video-renderer")だと何もかえってきません 

指定の仕方はあっています。だけど、そのIDやclassがHTML上に存在しないから取得できないだけです。

url = "https://www.youtube.com/results?search_query="+keyword
html = req.urlopen(url)

req.urlopenを使って、HTMLを取得してるからそのようにになるのだと思います。つまりこのスクリプトを実行してChromeが立ち上がって検索画面が表示されますが、それとは別にreq.urlopenを使って、HTTPリクエストをなげてHTMLを取得してる ので、画面で表示されてるHTMLと、実際にプログラムがBeatufiulSoupで解析してるHTMLが別ものだから、みつからないのだと思います。

 URLにひらがなが入るとurlopen()の所でエラーが出てしまいます。

日本語のパラメータをURLエンコードしてあげてください。

https://qiita.com/mix/items/87d094414e46f857de45

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/23 22:08

    ご解答ありがとうございます。
    貼っていただいたリンク先参照させていただきます。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • HTML

    8932questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Python

    7907questions

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

  • スクレイピング

    328questions