質問: [] for cell in row.findAll(['td']): csvRow.append(cell.get_text().replace(' ', '').replace('\n', '').replace('\r', '')) writer.writerow(csvRow) ```
回答: 元々のHTMLの構造が良く分からないので、ソースコードと出てきた結果から推測すると、各要素は1行に1つだけのようですね。 仕様がいまいち曖昧なので以下のように考えてみました。 提示された部分のソースを、1つのURLに対する処理と考え、「複数行表示を1行表示にする」ということは、その中に要素が何個あろうともcsvの1行に格納するという風に見えます。 そうすると、プログラムを以下のようにすれば、希望する結果になるのではないでしょうか? 変更部分にコメントを入れています。 ``` 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に書き込む ``` 曖昧な点というのは以下のものです。 * 最初のテーブル1つしか処理していないように見える(`table = bsObj.findAll("table")[0]`)が、テーブルが複数存在した場合はどうするのか。 * 質問の例のように1つのURLがcsvで1行になるのか、何かの条件を基準に1つのURLでもcsvで複数行になるのか。 * 複数のURLに対する処理はどうする/どうなるのか。(提示されたソースを繰り返すのか、あるいはこのソースの先頭に来た時点で複数URLの処理は終わって1つのオブジェクトにまとめられているのか) そういえば検索してみると参考にしたと思われる記事が以下にありましたが、そちらでは質問記事と同様のプログラムでちゃんとcsvとしてのデータになっているようです。 【Python】BeautifulSoupを使ってテーブルをスクレイピング だから、情報を取得したいサイトと、そのテーブルの構成がどうなっているか、それらから要素をどのようにcsvの各列に組み合わせていくか、といった考え方が重要になるわけです。