57593


初心者のためわかりにくい部分もあるかと思いますが、教えてください。  
スクレイピングで取得したテーブルデータをCSVで書き出し、  
マイクロソフトのエクセルで開いた場合、

項目1 値1 項目4 値4  
項目2 値2 項目5 値5  
項目3 値3 項目6 値6

元のテーブルの形式上、このように表示されます。

これを、

項目1 項目2 項目3 項目4  
値1 値2 値3 値4 ....

というようにエクセルで開いた時に項目が一行にまとめて表示させるようにしたいです。

様々なサイトを見てコードをコピペしたので、  
下記のようなコードとなっております。

いろいろ検索したものの解決できず困っております。  
お知恵をいただければ幸いです。

[code]

    import csv
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    html = urlopen("https:xxxxxxxxx")
    bsObj = BeautifulSoup(html, "html.parser")
    
    table = bsObj.findAll("table", {"class":"xxxxxxxx"})[0]
    
    rows = table.findAll("tr")
    
    with open("xxx.csv", "w", encoding='utf_8_sig',  newline='') as file:
        writer = csv.writer(file)
        for row in rows:
            csvRow = []
            for cell in row.findAll(['td', 'th']):
                csvRow.append(cell.get_text())
            writer.writerow(csvRow)
    
[/code]


CC BY-SA 4.0
2019-08-25T11:27:36.827
57589
2019-08-25T23:26:45.773
23420
question
python3 csv web-scraping beautifulsoup
スクレイピングで取得した複数列のテーブルデータをCSVに書き出す時に1列にする方法


以下の様な感じでしょうか。

元のソースのデータ取得と書き込みを組み合わせて行っている部分を、データ取得して2次元リストにする処理だけにします。

[code]

    rows = table.findAll("tr")
    data = []
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td', 'th']):
            csvRow.append(cell.get_text())
        data.append(csvRow)
    
[/code]

上記が終わった時点で、`data`の中身は以下の初期化を行ったのと同等になっているはずです。

[code]

    data = [['項目1', '値1', '項目4', '値4'],
            ['項目2', '値2', '項目5', '値5'],
            ['項目3', '値3', '項目6', '値6']]
    
[/code]

出来た`data`を以下の記事を参考に変形します。  
[Pythonのスライスによるリストや文字列の部分選択・代入](https://note.nkmk.me/python-slice-usage/)
から「二次元配列（リストのリスト）の場合」  
[Pythonで配列や行列の結合](https://qiita.com/AfricaUmare/items/22de1ca413176e4a19a6) から
[配列の結合](https://qiita.com/AfricaUmare/items/22de1ca413176e4a19a6#%E9%85%8D%E5%88%97%E3%81%AE%E7%B5%90%E5%90%88)  
[Pythonでflatten（多次元リストを一次元に平坦化）](https://note.nkmk.me/python-list-flatten/)
から「sum()」

[code]

    col1 = [a[:2] for a in data]
    col2 = [a[2:] for a in data]
    
    col1.extend(col2)
    
    row1 = [a[:1] for a in col1]
    row2 = [a[1:] for a in col1]
    
    row1 = sum(row1, [])
    row2 = sum(row2, [])
    
    array2d = [row1, row2]
    
[/code]

出来た`array2d`は以下の様になっているはずです。

[code]

    array2d = [['項目1', '項目2', '項目3', '項目4', '項目5', '項目6'],
               ['値1', '値2', '値3', '値4', '値5', '値6']]
    
[/code]

そして以下の記事の様に書き込みます。  
[PythonでCSVの読み書き](https://qiita.com/okadate/items/c36f4eb9506b358fb608) の [2\.
書き込み](https://qiita.com/okadate/items/c36f4eb9506b358fb608#2-%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF)

[code]

    with open("xxx.csv", "w", encoding='utf_8_sig',  newline='') as file:
        writer = csv.writer(file)
        writer.writerows(array2d)
    
[/code]

`xxx.csv`ファイルの中身は以下の様になるはずです。

[code]

    項目1,項目2,項目3,項目4,項目5,項目6
    値1,値2,値3,値4,値5,値6
    
[/code]


CC BY-SA 4.0
2019-08-25T23:26:45.773
57593
2019-08-25T23:26:45.773
26370
57589
answer