2017-11-07 27 views
2

私はPythonでいくつかの要素から電話番号と住所を取得するためのスクリプトを書いています。事は私が電話番号を解析しようとした方法は間違いなく乱雑です。私は住所のために同じことをすることができます。しかし、よりクリーンで良い方法がありますか?データが埋め込まれた内電話番号と住所を解析できません

要素:ところで

(330)971-7456 

from lxml.html import fromstring 

tree = fromstring(html_content) 
phone = ' '.join([elem.text_content().strip().split()[-2] for elem in tree.cssselect("div")]) 
phone1 = ' '.join([elem.text_content().strip().split()[-1] for elem in tree.cssselect("div")]) 
print(phone+phone1) 

結果:

html_content=''' 
    <div style=""> 
     <strong>Pamela Banchy, Chief Information Officer</strong> 
      <br>Western Reserve Hospital<br> 
      <br>Lyndhurst, OH <br> 
       <a href="mailto:[email protected]">[email protected]</a> 
      <br>(330) 971-7456<br> 
    </div> 
    ''' 

式とスクリプトが、私は電話番号を解析するために使用しました、アドレスはLyndhurst, OH、電話番号は(330)971-7456ですadyは乱雑なやり方でつかまった。

+0

はあなたからの情報、あるいはこの1つだけを抽出するために多くの類似のタグを持っていますか? – Reti43

+0

多くの同様のbrタグですが、一般的なことは電話番号が最後の位置にあり、アドレスが3番目にあることです。 – SIM

答えて

0

テキストを改行で分割することができるため、アドレスと電話番号を最小限の後処理で簡単に取得できます。あなたがそれを行うことができます

for elem in tree.cssselect('div'): 
    elem = elem.text_content().split('\n') 
    address = elem[-4].strip() 
    phone = elem[-2].replace(' ', '') 
+0

私はそれをあなたが私に方法を示してくれた理由で受け入れるつもりです。私はそれをライナーにするアイディアを持っています。 tree.cssselect( "div")])内のelemのための '.addin([elem.text_content()。strip()。split( '\ n')[ - 3]' 'phone = ' '.join([elem.text_content()。strip()。split(' \ n ')tree.cssselect( "div")])のelemのために ' – SIM

+1

@Shahin私はそれをこう書いています。それぞれのdivタグからアドレスと番号を個別に抽出したいと仮定していました。あなたのワンライナーは、すべての住所とすべての電話番号を一緒に連結します。それがうまくいくなら、これは問題ありません。ちなみに、アドレス自体にスペースを入れることができる場合は、スペースを使ってアドレスを連結することができます。 – Reti43

+0

ありがとうReti43、すべてのために。 – SIM

0

より具体的なCSSセレクタをお試しください。 tree.cssselect("div")によって返された値を操作するのではなく、あなたがそのテキストにアクセスするときに、返す必要があります「(330)971から7456の」

tree.cssselect("div > br:nth-child(3)") 

を使用することができます。 >は親の要素にアクセスします。 div > brは、親が<div>の要素であるすべての<br>要素を選択し、 "3"は親の3番目の子を指定します。詳細はhereを参照してください。 S <div>「が<br>とS」のの2グループがあった場合

これは、この単純なケースでは動作しますが、div > br:nth-child(3)で指定された複数の要素がある場合は、問題に遭遇するかもしれない、と言います。この場合、CSSセレクタは複数の値(リストなど)を返す必要があり、すべてをループして各電話番号を抽出したいとします。 免責事項:私はlxml.htmlライブラリを使用しておらず、cssselect()の期待される機能を調査していないので、ここでの保証はありません。

+0

あなたのセレクターは意味をなさない。あなたのお試しいただきありがとうございます! – SIM

+0

もう少しあなたのHTMLコードを見た後、私はそれにもいくつかの説明が必要であることを認識しました。たとえば、 '
HI THERE
'はそれ自身では意味がありません。 '
HI THERE
'にする必要があります。インデントが混乱していることを認識した後、私のCSSセレクタを編集しました。より明確な例を提供してください! – musikreck

+0

私はあなたのセレクタを見るのが本当に混乱しています。どのようにしてbrタグに基づいてセレクタを作成しますか?それは改行です。 – SIM

0

私はより良い方法はxpathを使用していると思います。 address, phone = tree.xpath('./div/br/text()')[-2:]

1

別の方法:

text_nodes = [node for node in tree.cssselect('div')[0].itertext() if node.split()] 
adress, phone = text_nodes[2], text_nodes[4] 
+0

このスタイルは私にとって全く新しいものです。ええ、それは事をする。ありがとうございます。 – SIM

+1

この場合、あなたのソリューションが最適です。コードの2行だけが5つの個別の結果をフェッチできます。もう一度おねがいします。 – SIM

+0

5つのテキストノードを5つの異なる変数に割り当てる場合は、構文 'name、work、address、email、phone = text_nodes'を使用できます – Andersson

関連する問題