62142


Pythonにてスクレイピングをしたいのですが、ファイル書き込みにおいて以下困っております。

■目的  
・webページ（複数）テーブルタグ内のtd要素をcsvファイルとして書き込みしたい。

■困っていること  
webページからtd要素を抜き出して以下のようにファイルを作成したいのですが、  
1行目（URL1）：要素1,要素2,要素3,,,,  
2行目（URL2）：要素1',要素2',要素3',,,,

ファイルを確認すると以下のように改行されてしまい、後からの整理が困難となってしまいます。

[code]

    要素1
    要素2
    要素3
    要素1'
    要素2'
    要素3'
    .
    .
    .
    
[/code]

うまく出力する方法をご教示いただけないでしょうか？  
コードは以下です。

[code]

    table = bsObj.findAll("table")[0]
    rows = table.findAll("tr")
    with open("ebooks.csv", "a", encoding='utf-8')  as file: 
        writer = csv.writer(file)
        for row in rows: 
            csvRow = []
            for cell in row.findAll(['td']): 
                csvRow.append(cell.get_text().replace(' ', '').replace('\n', '').replace('\r', ''))
            writer.writerow(csvRow)
    
[/code]


CC BY-SA 4.0
2020-01-10T09:18:25.817
62131
2020-01-10T22:41:33.547
2020-01-10T12:46:14.200
3060
37403
question
python web-scraping
スクレイピング結果の複数行表示を１行表示にする方法


元々のHTMLの構造が良く分からないので、ソースコードと出てきた結果から推測すると、各要素は1行に1つだけのようですね。

仕様がいまいち曖昧なので以下のように考えてみました。

提示された部分のソースを、1つのURLに対する処理と考え、「複数行表示を１行表示にする」ということは、その中に要素が何個あろうともcsvの1行に格納するという風に見えます。  
そうすると、プログラムを以下のようにすれば、希望する結果になるのではないでしょうか？  
変更部分にコメントを入れています。

[code]

    table = bsObj.findAll("table")[0]
    rows = table.findAll("tr")
    with open("ebooks.csv", "a", encoding='utf-8')  as file: 
        writer = csv.writer(file)
        csvRow = []  # テーブルの1行毎ではなく1つのURLの処理の全体で1回の初期化を行う
        for row in rows: 
            for cell in row.findAll(['td']): 
                csvRow.append(cell.get_text().replace(' ', '').replace('\n', '').replace('\r', ''))
    
        writer.writerow(csvRow)  # 1つのURLの全ての要素を1つの行としてcsvに書き込む
    
[/code]

曖昧な点というのは以下のものです。

  * 最初のテーブル1つしか処理していないように見える(`table = bsObj.findAll("table")[0]`)が、テーブルが複数存在した場合はどうするのか。
  * 質問の例のように1つのURLがcsvで1行になるのか、何かの条件を基準に1つのURLでもcsvで複数行になるのか。
  * 複数のURLに対する処理はどうする/どうなるのか。(提示されたソースを繰り返すのか、あるいはこのソースの先頭に来た時点で複数URLの処理は終わって1つのオブジェクトにまとめられているのか)

* * *

そういえば検索してみると参考にしたと思われる記事が以下にありましたが、そちらでは質問記事と同様のプログラムでちゃんとcsvとしてのデータになっているようです。  
[【Python】BeautifulSoupを使ってテーブルをスクレイピング](https://qiita.com/hujuu/items/b0339404b8b0460087f9)

だから、情報を取得したいサイトと、そのテーブルの構成がどうなっているか、それらから要素をどのようにcsvの各列に組み合わせていくか、といった考え方が重要になるわけです。


CC BY-SA 4.0
2020-01-10T17:10:21.147
62142
2020-01-10T22:41:33.547
2020-01-10T22:41:33.547
26370
26370
62131
answer