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

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

ただいまの
回答率

88.09%

classやidのないul、liのテキストをピンポイントで抽出したい

解決済

回答 1

投稿

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

score 6

前提・実現したいこと

・指定したURLの該当箇所をテキストで抽出し、結果をエクセルもしくはcsvファイルに格納したいです。
Pythonのbeautifulsoupパッケージでアマゾンの商品画面から、
書籍名、著者名、発行年、出版社、ISBNを抽出しようとしていたのですが、出版社とISBNが記載されている部分がうまく抽出できませんでした。

cssセレクタ(#detail_bullets_id > table > tbody > tr > td > div > ul > li:nth-child(2))をコピーし、
soup.find_all("#detail_bullets_id > table > tbody > tr > td > div > ul > li:nth-child(2)")
と指定しても、[]しか返って来ませんでした。
クラス名で絞り込もうと
soup.find_all(class_="contnt")を試すといらない部分が返ってきて、
soup.find_all(class_="contnt","ul")のように複数要素で絞り込もうとすると[]となってしまいます。

classやulを複数条件で絞り込み、テキストとして該当部分のみ抽出する方法はありますでしょうか?
html、css、Python 初心者で、いろいろと勘違い等あるかと思いますが、
アドバイスいただければ幸いです。

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

print(soup.find_all('ul', {"class":"content"}))


に対して、[]が返る

該当のソースコード

import requests
import re
import bs4
import pandas as pd
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
           "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "DNT":"1","Connection":"close", "Upgrade-Insecure-Requests":"1"}

url="https://www.amazon.co.jp/gp/product/4791768477"
html=requsts.get(url,headers=headers)
soup=bs4.BeautifulSoup(html.content,features="lxml")
title=soup.h1.select("#productTitle")
author=soup.find_all(class_={'author notFaded'})
date=soup.find_all(class_="a-size-medium a-color-secondary a-text-normal")
price=soup.find_all(class_={"a-button-text",",class_=a-color-base"},href="javascript:void(0)",role="button")
items = soup.find_all('div', {"id":"detail_bullets_id"})

ret = []
title = [t.text for t in title]
author = [t.text for t in author]
price = [t.text for t in price]
info = []
for ul_tag in items:
    for li in ul_tag.find_all('td', {"class":"bucket"}):
            info.append(li.text)
            if(li==2):
                break
print_list=[title,author,price,info]
print(print_list)

試したこと

該当部分より上のレベル?('div', {"id":"detail_bullets_id"})で絞り込みをかけ、余計な部分が入りつつも欲しい情報を格納することはできました。
が、余計な部分が大きすぎるので、printで出力を調整するか、そもそもきちんと狙いの個所を抜き取る方法がわかればと思案しております。

補足情報(FW/ツールのバージョンなど)

Windows subsystem for LynuxでUbuntu.18.04から、Jupterlabを起動して行っています。
ちなみに、PythonにおいてRStudioのようなコードを行ずつ実行・確認ができるプラットフォームはあるのでしょうか?
また、前段階についての初歩的な質問として、"text.txt"にURLが複数格納されているのですが、Windowsの例えばデスクトップ上の"folder"フォルダにtxtファイルがある場合、
with open("C:/Users/~~/Desktop/folder/text.txt") as f:
lines = f.read().splitlines()
このコードではファイルが見つからないとエラーが返り、現在のディレクトリにtext.txtをコピーすると、Permission deniedのエラーになり、外部ファイルの読み込みがうまくいきません。こちらについてもアドバイスいただけますと幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2020/01/19 08:47 編集

    >アマゾンの商品画面から、
    書籍名、著者名、発行年、出版社、ISBNを抽出

    そもそもAmazonはスクレイピングは規約で禁止されているはずで、
    対策強化を進めているという話も見かけます。

    キャンセル

回答 1

checkベストアンサー

+1

一般的には、
案1:HTMLをよく見て考えて、ピンポイントで指定できるXPathを考えます。
CSS記法は要素を特定するには貧弱です。beautifulsoupはXPathを使えないのでXPathを使えるパッケージを追加で使います。

案2:beautifulsoupで多めにとって、プログラムロジック側で必要な部分を抽出します。

今回としては、
Amazonはウェブページのスクレイピングは禁止されています。APIがありますが、アフィリエイトのためのもので売り上げが無い場合は回数制限が厳しくなりました。
国会図書館のAPIはだれでも自由に使えるので、そういうのを使うとよいかと思います。
⇒ 国立国会図書館サーチについて 

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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