2011-02-03 10 views
3

プログラミングには一般的なので、間違った方法をとっています。私はパーザの出力からコンテンツを持たないHTMLテーブルの行を省略したいlxmlパーサーを作成しています。条件付きでリスト内の項目を繰り返し処理するPythonic方法

for row in doc.cssselect('tr'): 
    for cell in row.cssselect('td'): 
     sys.stdout.write(cell.text_content() + '\t') 
    sys.stdout.write '\n' 

write()ものは一時的なものである:これは私が持っているものです。私が望むのは、ループが行を返すことだけです。tr.text_content != ''です。だから、私は、私の脳が 'a = b'ならaのためにあるはずのことを書く方法を尋ねていると思うが、それはうまくいかない。

ありがとうございます!

+0

あなたは正確に何をしようとしていますか? xmlの解析は単純ではありません。あなたはちょうど始まって以来、何か他のことを試してみるべきでしょうか?どのように私たちはいくつかのサンプル入力/出力を見せてください – Falmarri

答えて

4
for row in doc.cssselect('tr'): 
    cells = [ cell.text_content() for cell in row.cssselect('td') ] 
    if any(cells): 
     sys.stdout.write('\t'.join(cells) + '\n') 

テキストコンテンツのセルが少なくとも1つある場合にのみ、行が印刷されます。

+1

問題は、すべての空のセルが削除されるため、正しく整列されないという問題だけです。したがって、1つの行に1つの空でないセルともう1つの2つの空でないセルがあり、それらは非表の整列を持つことになります。 – troutinator

+0

@troutinator - 私は答えを編集しました。これですべてまたは何も印刷されません。 – eumiro

+0

Spot-on、ありがとう。 –

0

REEDIT

あなたが知っている、私は本当にすべてで私の答えを好きではありません。私は他の答えを投票したが、それは私が犠牲になった何である「空想」取得せずにクリーンが、自明だっただけでなくので、私は彼のオリジナルの答えを言っています:はるかにエレガントな解決策のはありません

for row in doc.cssselect('tr'): 
    for cell in row.cssselect('td'): 
     if(cel.text_content() != ''): 
      #do stuff here 

オリジナルっぽい

[cell for cell in row.cssselect if cell.text_content() != ''] 

をし、リスト内包表記にそれを回す:

あなたは次のように二forループを変換することができます。そうすれば、事前に選別されたリストが得られます。あなたも遠く、次の例を見て、それを取ることができます:[1, 2, 2, 3, 3, 4]に変換し

a = [[1,2],[2,3],[3,4] 
newList = [y for x in a for y in x] 

を。その後、最後にifステートメントを追加して値を除外することができます。したがって、これを1行に減らすことができます。

その後、再び、あなたはitertoolsを見ていた場合:

ifilter(lambda x: x.text_content() != '', row.cssselect('td')) 

はあなたが望んでいないすべての項目をスキップし、反復処理することができますイテレータを生成します。

編集

そして、私はより多くのdownvotesを取得する前に、あなたのpython 3.0を使用している場合、filter同じように動作します。輸入する必要はありませんifilter

+0

いいえあなたはできません... –

+0

いいえ、できません。これはリスト内包の中でのみ機能します。 –

+0

これは私が遭遇した問題です。明確にするために少し言い換えられた質問。 –

関連する問題