1

私はあらゆる方法を試してきましたが、何をしても空白の出力が得られます。これは、インポートして解析しようとしているファイルの短縮版です。

<PRESOL>
<DATE>0310
<AGENCY>Defense Logistics Agency
<DESC>*(this is full of HTML tags and the such)*
<URL>https://www.fbo.gov/spg/DLA/J3/DSCR-BSM/SPE4A713R0575/listing.html
<SETASIDE>N/A
</PRESOL>

「PRESOL」タグの間にはこのような数百のエントリがあるため、DATE、AGENCY、DESC、URL、および SETASIDE ごとに列を持つテーブルを作成したいと思います。各タグのデータの後にリターンもあります。これは、Python に取り込むと「\n」として表示されます。これまでに試した正規表現は次のとおりです(sはファイルを読み込んだ変数で、reはインポートされています):

testall = re.findall(r'<PRESOL>\n<DATE>(.*?)\n<AGENCY>(.*?)\n<DESC>(.*?)\n<URL>(.*?)\n<SETASIDE>(.*?)\n</PRESOL>', s)

「\n」なしで、(.*?) の代わりに (.+?) を使用してこれを試しました。

私を助けるためにさらに情報が必要な場合はお知らせください。どんな助けも大歓迎です。私の最終的な目標は、ftp: //ftp.fbo.gov/FBOFeed20130311からデータを簡単にインポートできるようにすることです (複数のテーブル タイプがあるようですが、この概念実証をオフにするためだけに、現時点では PRESOL に焦点を当てています地面。

4

3 に答える 3

0

ftp で次の例を見ました (popaddress に注目するために最初のフィールドを切り取っています)。

In [7]: data = """<PRESOL>
   ...: <DESC>Link To Document
   ...: <SETASIDE>N/A
   ...: <POPCOUNTRY>US
   ...: <POPADDRESS>Moody AFB, GA
   ...: Avon Park, FL
   ...: </PRESOL>"""

In [11]: re.findall(r'<PRESOL>\n<DESC>(.*?)\n<SETASIDE>(.*?)\n<POPCOUNTRY>(.*?)\n<POPADDRESS>(.*?)\n</PRESOL>', data)
Out[11]: []

最後のフィールドの \n の後にタグがないため、一致しません。それが問題です。

FTP のデータを監視していると、DESC、CONTACT などの他の複数行フィールドがあり、場合によっては非常に大きく、HTML タグで囲まれていることがわかります。おそらく、単一の正規表現でデータの「行」全体を解析しようとするのではなく、よりアルゴリズム的な方法を使用した方がよいでしょう。この行ごとに検討するのに十分なコーナーケースがあると思います。

幸運を!

于 2013-03-15T01:35:55.280 に答える
0

テーブルに変換できるデータ構造を作成する 1 つのアイデアを次に示します。

presol = []
split = re.split('<\/PRESOL>', file_data)

for s in split:
    d = {}
    for k,v in re.findall('<([^>]+)>(.[^<]+)\n', s, re.M|re.S):
        d[k]=v
        presol.append(d)

print("DATE\tAGENCY\tDESC\tURL\tSETASIDE\n")
for p in presol:
    print("%s\t%s\t%s\t%s\t%s\n"%(p["DATE"], p["AGENCY"], p["DESC"], p["URL"], p["SETASIDE"]))
于 2013-03-15T01:38:27.453 に答える