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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

Q&A

解決済

2回答

912閲覧

ページ構成維持を重視したスクレイピング&CSV保存のベストプラクティス

fukazume

総合スコア78

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

0グッド

0クリップ

投稿2020/07/22 02:09

編集2020/07/22 04:14

##■経緯

以下のようなプログラムで、スクレイピングしたWebページのHTMLソースを1つのレコードフィールドとしてCSVに保存し、別のWebサービス上でそのソースのHTMLタグやレイアウトの再現性を可能な限り高い形で展開/再構成し表示したいと考えています。

上記を達成するためのスクレイピング手法として私なりに意識したのは以下の点です。
・HTMLタグ付き
・CSVの改行コードを"\r\n" に変更することでHTMLソース内の改行\nと区別

しかし、下記コードを実行しても、CSVとしてレコードのフィールド内にうまく収まってくれません。

python

1# -*- coding: utf-8 -*- 2import requests 3import csv 4from bs4 import BeautifulSoup as bs4 5 6source = './test.csv' 7url = 'http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html' 8row = [] 9 10r = requests.get(url) 11soup = bs4(r.content,'lxml') 12 13row.append(soup.find(class_='content')) 14 15with open(source, 'w', encoding="UTF-8") as f: 16 writer = csv.writer(f, lineterminator='\r\n', quoting=csv.QUOTE_NONNUMERIC) 17 writer.writerow(row)

##■質問
上記目的を達成するための常套の手法などございましたらヒントなどいただけますと誠にありがたく存じます。

##■環境
Windows 10
Python 3.8.3

##■CSV出力結果(test.csv)

csv

1"<div class=""content""> 2<div id=""promotions""> 3</div> 4<div id=""content_inner""> 5<article class=""product_page""><!-- Start of product page --> 6<div class=""row""> 7<div class=""col-sm-6""> 8<div class=""carousel"" id=""product_gallery""> 9<div class=""thumbnail""> 10<div class=""carousel-inner""> 11<div class=""item active""> 12<img alt=""A Light in the Attic"" src=""../../media/cache/fe/72/fe72f0532301ec28892ae79a629a293c.jpg""/> 13</div> 14</div> 15</div> 16</div> 17</div> 18<div class=""col-sm-6 product_main""> 19<h1>A Light in the Attic</h1> 20<p class=""price_color"">£51.77</p> 21<p class=""instock availability""> 22<i class=""icon-ok""></i> 23 24 In stock (22 available) 25 26</p> 27<p class=""star-rating Three""> 28<i class=""icon-star""></i> 29<i class=""icon-star""></i> 30<i class=""icon-star""></i> 31<i class=""icon-star""></i> 32<i class=""icon-star""></i> 33<!-- <small><a href=""/catalogue/a-light-in-the-attic_1000/reviews/""> 34 35 36 0 customer reviews 37 38 </a></small> 39 -->  40 41 42<!-- 43 <a id=""write_review"" href=""/catalogue/a-light-in-the-attic_1000/reviews/add/#addreview"" class=""btn btn-success btn-sm""> 44 Write a review 45 </a> 46 47 --></p> 48<hr/> 49<div class=""alert alert-warning"" role=""alert""><strong>Warning!</strong> This is a demo website for web scraping purposes. Prices and ratings here were randomly assigned and have no real meaning.</div> 50</div><!-- /col-sm-6 --> 51</div><!-- /row --> 52<div class=""sub-header"" id=""product_description""> 53<h2>Product Description</h2> 54</div> 55<p>It's hard to imagine a world without A Light in the Attic. This now-classic collection of poetry and drawings from Shel Silverstein celebrates its 20th anniversary with this special edition. Silverstein's humorous and creative verse can amuse the dowdiest of readers. Lemon-faced adults and fidgety kids sit still and read these rhythmic words and laugh and smile and love th It's hard to imagine a world without A Light in the Attic. This now-classic collection of poetry and drawings from Shel Silverstein celebrates its 20th anniversary with this special edition. Silverstein's humorous and creative verse can amuse the dowdiest of readers. Lemon-faced adults and fidgety kids sit still and read these rhythmic words and laugh and smile and love that Silverstein. Need proof of his genius? RockabyeRockabye baby, in the treetopDon't you know a treetopIs no safe place to rock?And who put you up there,And your cradle, too?Baby, I think someone down here'sGot it in for you. Shel, you never sounded so good. ...more</p> 56<div class=""sub-header""> 57<h2>Product Information</h2> 58</div> 59<table class=""table table-striped""> 60<tr> 61<th>UPC</th><td>a897fe39b1053632</td> 62</tr> 63<tr> 64<th>Product Type</th><td>Books</td> 65</tr> 66<tr> 67<th>Price (excl. tax)</th><td>£51.77</td> 68</tr> 69<tr> 70<th>Price (incl. tax)</th><td>£51.77</td> 71</tr> 72<tr> 73<th>Tax</th><td>£0.00</td> 74</tr> 75<tr> 76<th>Availability</th> 77<td>In stock (22 available)</td> 78</tr> 79<tr> 80<th>Number of reviews</th> 81<td>0</td> 82</tr> 83</table> 84<section> 85<div class=""sub-header"" id=""reviews""> 86</div> 87</section> 88</article><!-- End of product page --> 89</div> 90</div>" 91

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

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

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

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

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

guest

回答2

0

ベストアンサー

私ならHTMLソースはバイナリとして扱うべきと考えBASE64化して保持します。
バイナリとして扱う(保持)するので、そのCSVに対してソース内の文字検索など行わない前提です。

投稿2020/07/22 07:06

can110

総合スコア38233

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

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

fukazume

2020/07/22 07:28 編集

いつもありがとうございます!BASE64は名前しか知りませんでした。よく調べてみます!バイナリとして扱う場合、出力としては、 ・1webページに対して1ファイル(バイナリ)という想定でしょうか? ・それとも、CSVで他のフィールドと混在する形で、例えば "日付","タイトル","特定classなどのHTMLソース(BASE64としてエンコードして)"\n, みたいな構造のCSVファイルを想定されているでしょうか? わかりにくい説明&質問で申し訳ございません!
can110

2020/07/22 07:31

BASE64はバイナリデータを英数文字のみで構成されたテキストに変換する規則です。 カンマや改行などを含まないテキスト文字列になるので、CSVとして保持できます。 > ・それとも、CSVで他のフィールドと混在する形で、例えば > "日付","タイトル","特定classなどのHTMLソース(BASE64としてエンコードして)"\n, > みたいな構造のCSVファイルを想定されているでしょうか? こっちの想定ですね。
fukazume

2020/07/22 07:42

ありがとうございます!となると、1ファイルに複数ページ分のHTMLソースをまとめようと思えば可能っぽいですね。こういった基本的な情報操作/ファイル管理でも指針的な情報(=ベストプラクティス)があまり検索でヒットしなかったので大変参考になります。理解にはまだ時間がかかりますが、BASE64、ぜひ深堀りしてみたいと思います!
guest

0

やりたいことがちょっとふわっとしているので、的はずれな回答かもしれませんが…

案1 テキストファイル

別のwebサービスとの連携方法にもよりますが、そのままHTMLをテキストファイルに保存するのが一番素直なように思えます。

案2 pickle

別のWebサービスもpythonであれば、Pickleを使うことで持ってきたデータをそのまま書き出しすることができます。
https://qiita.com/hatt0519/items/f1f4c059c28cb1575a93

案3 JSON

別のWebサービスが、Pythonに縛られたくないのであれば、JSON形式あたりを使うのがよいのではないでしょうか。

投稿2020/07/22 04:27

YakumoSaki

総合スコア2027

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

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

fukazume

2020/07/22 07:12

あいまいな質問に挑んでくださり、また複数の案をご提示くださり、誠にありがとうございます!個別テキストファイルへ書き出すアイディアを思い浮かびませんでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問