我一直在努力将Google Earth KML文件转换为GIS shapefile(或其他GIS文件格式,例如Postgresql / PostGIS表格)(请参阅 - GIS.stackexchange question here基本上我想转换KML归档为CSV。
我的问题是KML文件包含存储在HTML表中的一些数据,因此解析的KML文件在我的结果数据表中有一个字段,其中包含HTML,如下所示:
"<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库时,我最终得到一个CSV文件,其中一个字段包含一大块HTML。我希望使用BeautifulSoup(或类似的Python库)将KML文件的HTML元素解析为我的CSV文件中的四个单独字段。我似乎能够将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
答案 0 :(得分:1)
美丽的汤通常非常适合直接达到你想要的东西(假设你可以在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)
这通常不是很有用,因此深入了解,我们甚至可以访问<{1>}中找到的节点中的元素。另外,如果需要,我们可以只隔离文本(使用&#34;字符串&#34;属性):
<description>
我总是打印以测试我得到了我想要的东西。如果那里什么都没有,那么你会得到很多 for node in soup.select('description'):
for item in node.select('td'):
print(item.string)
个。无论如何,这应该让你接近,显然,不是打印输出,你可以用它做任何你想做的事情(存储在一些容器中,写出来到csv等)。这可能适用于您粘贴到评论中的块,但可能不是您初始问题中的块,因为您有多个描述标记。
在您的问题中,您有多个None
标记,并非所有这些标记都有节点,在这种情况下,您需要使用find_all而不是select:
<description>