3

Google Earth KML ファイルを GIS シェープファイル (または Postgresql/PostGIS テーブルなどの他の GIS ファイル形式) に変換しようとして、限られた成功しか収めていません (参照 - GIS.stackexchange の質問はこちら本質的に、KML ファイルをCSV。

私の問題は、KML ファイルに HTML テーブルに格納されたデータが含まれているため、解析された KML ファイルには、次のような HTML を含む結果のデータ テーブルに 1 つのフィールドがあることです。

    "<br><br><br>
<table border="1" padding="0">
<tr><td>ID_INT</td><td>NGA0104001</td></tr>
<tr><td>N_sd</td><td>Igbere</td></tr>
<tr><td>Skm2</td><td>3.34</td></tr>
<tr><td>PT2010</td><td>13000</td></tr>"

GDALライブラリを使用すると、フィールドの 1 つに HTML のチャンクを含む CSV ファイルが作成されます。BeautifulSoup (または同様の Python ライブラリ) を使用して、KML ファイルの HTML 要素を CSV ファイル内の 4 つの個別のフィールドに解析したいと考えていました。KML を BeautifulSoup に渡すことができるようですが、ここから何をすればよいか、または実際に同じことを達成する別の方法があるかどうかはわかりません。

ここや他の場所でこの件に関する同様の質問をたくさん読みましたが、このファイルの解析をどこから開始すればよいか本当にわかりません。これを達成することに成功した人はいますか?? たくさんの、たくさんの前もって感謝します...

ああ、これが例としての私の KML ファイルからのコードのチャンクです。

 <?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
    <Document>
    <name>AFNGA_SWAC.kml</name>
    <open>1</open>
    <Style id="s_ylw-pushpin1">
        <IconStyle>
            <scale>1.1</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
        <LineStyle>
            <color>ff00ffff</color>
            <width>3</width>
        </LineStyle>
        <PolyStyle>
            <color>3300ffff</color>
        </PolyStyle>
    </Style>
    <StyleMap id="m_ylw-pushpin1">
        <Pair>
            <key>normal</key>
            <styleUrl>#s_ylw-pushpin1</styleUrl>
        </Pair>
        <Pair>
            <key>highlight</key>
            <styleUrl>#s_ylw-pushpin_hl1</styleUrl>
        </Pair>
    </StyleMap>
    <Style id="s_ylw-pushpin_hl1">
        <IconStyle>
            <scale>1.3</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
        <LineStyle>
            <color>ff00ffff</color>
            <width>3</width>
        </LineStyle>
        <PolyStyle>
            <color>3300ffff</color>
        </PolyStyle>
    </Style>
    <Folder>
        <name>AFNGA_SWAC</name>
        <open>1</open>
        <description>1027 Éléments de la couche Afnga_swac</description>
        <Placemark>
            <name>Aba</name>
            <description><![CDATA[<br><br><br>
    <table border="1" padding="0">
    <tr><td>ID_INT</td><td>NGA0101001</td></tr>
    <tr><td>N_sd</td><td>Aba</td></tr>
    <tr><td>Skm2</td><td>384.07</td></tr>
    <tr><td>PT2010</td><td>1010000</td></tr>]]></description>
            <styleUrl>#m_ylw-pushpin1</styleUrl>
            <Polygon>
                <extrude>1</extrude>
                <tessellate>1</tessellate>
                <outerBoundaryIs>
                    <LinearRing>
                        <coordinates>
                            7.294567000000001,5.00267,0 7.294408999999999,5.002552,0 7.294211,5.002394,0
4

1 に答える 1

2

Beautiful Soup は通常、目的のものをすぐに取得するのに非常に優れています (探しているデータを保持するパターンを xml/html 内で簡単に識別できると仮定します)。出力をどのようにフォーマットするか正確にはわかりませんが、<description>タグ内のデータを探している場合は、実際には非常に簡単です (以下の例は Python3 のものです)。

from bs4 import BeautifulSoup

inputfile = "whateveryourfileiscalled.xml"
with open(inputfile, 'r') as f:
  soup = BeautifulSoup(f)

  # After you have a soup object, you can access tags very easily.
  # For instance, you can iterate over and get <description> like so:

  for node in soup.select('description'):
       print(node)

多くの場合、これはあまり役に立ちません。そのため、もう少し深く掘り下げると、 で見つけたノード<description>の要素にアクセスすることさえできます。さらに、必要に応じてテキストだけを分離することもできます ("string" 属性を使用):

  for node in soup.select('description'):
     for item in node.select('td'):
         print(item.string)

私は常に印刷して、必要なものが得られていることをテストします。そこに何もない場合は、多くのNones が得られます。とにかく、これはあなたを近づけるはずです。明らかに、出力を印刷する代わりに、それを使って好きなことをすることができます(コンテナに保存する、csvに書き出すなど)。これは、コメントに貼り付けたチャンクでは機能する可能性がありますが、複数の説明タグがあるため、最初の質問のチャンクでは機能しない可能性があります。


あなたの質問では、複数の<description>タグがあり、これらのすべてにノードがあるわけではありません。その場合、select の代わりに find_all を使用する必要があります。

  for node in soup.find_all('description'):
      for item in node.find_all('td'):
          print(item.string)
于 2013-09-15T21:45:08.993 に答える