5

私はプログラミングにかなり慣れていないので、これに対する解決策を見つけようとしていますが、見つけることができるのは、すべてをまとめる運がまったくないビットとピースだけです。

BeautifulSoup4in を使用しpythonて、いくつかをスクレイピングxmlし、テキスト値を変数の特定のタグの間に保存しようとしています。データは医学生のトレーニング プログラムからのものであり、現在、必要なものはすべて手動で見つける必要があります。そこで、スクレイピングプログラムで効率を少し上げようとしています。

たとえば、実験のためにこのタイプのテストデータを見ていたとしましょう:

<AllergyList>
<Allergy>
    <Deleted>n</Deleted>
    <Status>
        <Active/>
    </Status>
    <ExternalID/>
    <Patient>
        <ExternalID/>
        <FirstName>Testcase</FirstName>
        <LastName>casetest</LastName>
    </Patient>
    <Allergen>
        <Name>Flagyl (metronidazole)</Name>
        <Drug>
           <NDCID>00025182151,00025182131,00025182150</NDCID>
        </Drug>
    </Allergen>
    <Reaction>difficulty breathing</Reaction>
    <OnsetDate>02/02/2013</OnsetDate>
 </Allergy>
<Allergy>
    <Deleted>n</Deleted>
    <Status>
        <Active/>
    </Status>
    <ExternalID/>
    <Patient>
        <ExternalID/>
        <FirstName>Testcase</FirstName>
        <LastName>casetest</LastName>
    </Patient>
    <Allergen>
        <Name>Bactrim (sulfamethoxazole-trimethoprim)</Name>
        <Drug>
            <NDCID>13310014501,49999023220</NDCID>
        </Drug>
    </Allergen>
    <Reaction>swelling</Reaction>
    <OnsetDate>05/03/2002</OnsetDate>
  </Allergy>
  <Number>2</Number>
</AllergyList>

プルの結果をそれぞれの変数に保存しながら<Name>、複数のタグの間からタグをプルし、とタグ<Allergen>の間からそれぞれのデータをプルしようとしました。<Onsetdate><Reaction>

したがって、たとえば、、、、、、、、などをプルし、Flagyl (metronidazole)後で使用できるように別の変数に配置します。difficulty breathing02/02/2013Bactrim (sulfamethoxazole-trimethoprim)swelling05/03/2002

タグから最初のセットを取得するのは簡単ですが、取得したデータを変数に格納する<Allergen>方法を反復処理する方法がわかりません。xmlデータを配列またはリストに格納する際に for ループを使用しようとしましたが、これまで書いてきた方法では、len()関数から計算する反復回数に応じて、常に同じデータを何度もプルします。それ以来、配列への保存に失敗しました。

私はこれについてしばらくの間頭を悩ませてきましたが、私はそれほど頭が良くないかもしれないと思うので、助けや正しい方向に私を向けさえすれば、非常に高く評価されます.

4

1 に答える 1

7

ネストされたタグがあまりないため、単純な作業のように見えます。

from bs4 import BeautifulSoup
import sys 

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'xml')

allergies = []
for allergy in soup.find_all('Allergy'):
    d = { 
        'name': allergy.Allergen.Name.string,
        'reaction': allergy.Reaction.string,
        'on_set_date': allergy.OnsetDate.string,
    }   
    allergies.append(d)

## Use 'allergies' array of dictionaries as you want.
## Example:
print(allergies[1]['reaction'])

xmlファイルを引数として実行します。

python3 script.py xmlfile

そして、このテストは次の結果をもたらします。

swelling
于 2013-11-08T14:44:24.273 に答える