2017-11-22 5 views
0

HTMLテーブルを解析してCSVに書き込もうとしています。私が働いているコードが、値を持つテーブル内の各セルにb'<value>'を返し、nullであるテーブル内の各セルにb''を返します。なぜ誰がこのことになるのか知っていますか?BeautifulSoupを使用してHTMLテーブルを解析して各セルのb 'を返します

は残念ながら、問題のURLは、パブリックインターネット経由で到達可能ではありませんが、ここではそれなしでレビューのために私のコードです:

from bs4 import BeautifulSoup 
    import urllib 
    import csv 
    import time 
    url = <not accessible over public internet> 
    html = urllib.request.urlopen(url).read() 
    soup = BeautifulSoup(html, "html.parser") 
    table = soup.select_one("table") 
    headers = [th.text.encode("utf-8") for th in table.select("tr th")] 
    with open("test_" + time.strftime("%Y%m%d_%H%M%S") + ".csv", "w") as f: 
     wr = csv.writer(f) 
     wr.writerow(headers) 
     wr.writerows([[td.text.encode("utf-8") for td in row.find_all("td")] for row in table.select("tr + tr")]) 

最後に、ここで私が話している出力のスクリーンショットの例です。 (敏感なものを編集から生じる醜を許し。)これ

Example_Output

答えて

0

編集それらのテキストと値のみを可能にします。 (下記のif td.textセクション)。

wr.writerows([[td.text.encode("utf-8") for td in row.find_all("td") if td.text] for row in table.select("tr + tr")]) 

(あなたがnull値をたくないと仮定)UPDATE: 変更

with open("test_" + time.strftime("%Y%m%d_%H%M%S") + ".csv", "w", encoding='utf-8') as f: 

にCSV形式のコマンドを開き、その後、CSV形式の書き込みから

wr.writerows([[td.text for td............... 
+0

ありがとう、null値はすべて削除されましたが、null以外の値はまだ ''ではなく 'b '' 'にラップされます。私の "Example_Output"スクリーンショットを見てください。 –

+0

これは、データが文字列ではないことを示すバイトリテラルです(UTF-8にデータをエンコードしたために発生します)。Pythonは比較などでそのデータを無視するので、心配する必要はありません。 – kmcodes

+0

素晴らしい!ありがとう。 –

0

エンコーディングを削除b''は文字列の一部ではありません。文字列"foo"または'foo'の場合とまったく同じ方法で、バイトリテラルの表現の一部です。fooのみが文字列であり、引用符はビジュアル表現の一部にすぎません。 Unicode文字列とバイト文字列の間の変換には、encodedecodeのメソッドを使用します。

関連する問題