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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3349閲覧

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

wggv

総合スコア6

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

1グッド

0クリップ

投稿2020/01/18 21:17

前提・実現したいこと

・指定した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"}))

に対して、[]が返る

該当のソースコード

Python3.7

1import requests 2import re 3import bs4 4import pandas as pd 5headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0", 6 "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 7 "DNT":"1","Connection":"close", "Upgrade-Insecure-Requests":"1"} 8 9url="https://www.amazon.co.jp/gp/product/4791768477" 10html=requsts.get(url,headers=headers) 11soup=bs4.BeautifulSoup(html.content,features="lxml") 12title=soup.h1.select("#productTitle") 13author=soup.find_all(class_={'author notFaded'}) 14date=soup.find_all(class_="a-size-medium a-color-secondary a-text-normal") 15price=soup.find_all(class_={"a-button-text",",class_=a-color-base"},href="javascript:void(0)",role="button") 16items = soup.find_all('div', {"id":"detail_bullets_id"}) 17 18ret = [] 19title = [t.text for t in title] 20author = [t.text for t in author] 21price = [t.text for t in price] 22info = [] 23for ul_tag in items: 24 for li in ul_tag.find_all('td', {"class":"bucket"}): 25 info.append(li.text) 26 if(li==2): 27 break 28print_list=[title,author,price,info] 29print(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のエラーになり、外部ファイルの読み込みがうまくいきません。こちらについてもアドバイスいただけますと幸いです。

atsushi3105👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/18 23:47 編集

>アマゾンの商品画面から、 書籍名、著者名、発行年、出版社、ISBNを抽出 そもそもAmazonはスクレイピングは規約で禁止されているはずで、 対策強化を進めているという話も見かけます。
guest

回答1

0

ベストアンサー

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

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

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

投稿2020/01/19 01:24

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問