2017-04-18 5 views
0
table = soup.find('table', attrs={'id':'MainContent_grdUsers2'}) 
data = [] 

for tr in table.find_all('tr')[1:] : 
    td = tr.find_all('td') 
    try : 
     data += [ 
      [ 
       td[0].getText() , 
       td[2].find('option', {'selected':'selected'}).getText(), 
       td[3].find('option', {'selected':'selected'}).getText(), 
       td[4].find('input').get('value'), 
       td[5].find('input').get('value'), 
       td[6].find('option', {'selected':'selected'}).getText() 
      ] 
     ] 
    except Exception as ex : 
     print(ex) 
     continue 


with open('test5.csv', 'w', newline='') as outfile: 
    writer = csv.writer(outfile) 
    for row in data : 
     writer.writerow([' '.join(str(r) for r in row)]) 

複雑なhtmlテーブルをcsvに解析しようとしています。このコードは動作し、目的のデータを取得しますが、各行は、行ごとに6つの値ごとに別々の列ではなく、1つのセルに格納されます。私はここで間違って何をしていますか?Beautifulsoupによって解析されたデータをCSV列に分割する

+0

可能であれば、入力データのサンプルを含めることをお勧めします。私はあなたがhttp://stackoverflow.com/q/43396370/2997179と同じデータを使用していると仮定しますか? –

答えて

1

newline=''を不必要に設定し、表のセルをスペースで結合しています。あなたのデータは、writer.writerows()に直接渡されるのに適した形式であるようです。

with open('test5.csv', 'w') as outfile: 
    writer = csv.writer(outfile) 
    header = ['Name', 'Rights', 'Bureaus', 'FullName', 'Email', 'Status'] 
    writer.writerow(header) 
    writer.writerows(data) 
+0

'newline = '''が必要です。そうでなければ、行間をスキップしますが、 'writer.writerows()'に直接渡すことで、必要に応じて動作します。シンプルなソリューションをありがとう、私はまずそれを試しておくべきだった。 – nvachhan

関連する問題