2017-01-18 4 views
0

人とその情報(電話、名前、位置、メールなど)を持つWebページを削り取ろうとしています。人々の中には、電話番号や電子メールのいずれかが不足していると私はリストを結合し、文字列を擦っていない場合はインデックスが異なるため、これに問題があります。それは完全にこのHTMLコードを持つ人々をスキップしていますが電子メールのない人のために空の文字列をスクラップする方法

<div class="contact-text contact-email ctaType-email"> 
    <a itemprop="email" href="mailto:[email protected]" alt= 
    "[email protected]" title="[email protected]">[email protected]</a>            
</div> 

:私は、このHTMLコードを持つ人々からのメールを取得しています

response.xpath('//ul//div[@class="contact-text contact-email ctaType-email"]/a/@title').extract() 

は、これは私がメールをこするてる方法です私のリストのインデックスを台無しにする。

<div class="contact-text contact-email ctaType-email"> 

</div> 

それはので、私は簡単にフィールドを結合したり、それらの空のフィールドに文字列を追加することができるよ空の電子メールアドレスフィールドをこすり作るためにとにかくはありますか?

ありがとうございます!

答えて

1

あなたは、単に二つの部分にあなたの抽出を分割することができます。

people = response.xpath('//ul//div[@class="contact-text contact-email ctaType-email"]') 
emails = [p.xpath('a/@title').extract() or '' for p in people] 

  1. エキス、すべての人が例えば一人一人のノードエキスの電子メールの場合
  2. または空

ノード

これらの問題を回避するための一般的なアプローチは、アイテムノードを抽出してからiteraテップ:

people = response.xpath('//ul//div[@class="contact-text contact-email ctaType-email"]') 
for person in people: 
    item = dict() 
    item['email'] = person.xpath('a/@title').extract() 
    item['something_else'] = person.xpath('...') 
    # ... 
    yield item 
+0

素晴らしいです。私はより効率的にすべての人のノードを抽出し、各自のために必要なサブフィールドを抽出するでしょうか?私は、サブフィールドを抽出して、それらに人々を照合しようとしてきました。たとえば、すべての名前をリストに抽出し、すべての電話番号をリストに抽出して、それらの2つのリストを結合します。 – Danopi

+1

@Danopiええ、最も一般的なアプローチは、ノードのブロックを抽出することです。すなわち、すべてのユーザノードを抽出し、各ノードを反復し、必要な値を子ノードで見つける。この方法は非常に明確で、不正な組み合わせ、空の値などのあらゆる種類の問題を回避します。これは、きれいな構造に従うだけです。あなたは私の言いたいことの私の編集を見ることができます。 – Granitosaurus

関連する問題