2017-04-25 6 views
0

Ich habe Probleme beim Parsen einer KML-Datei (XML) mit schönen Suppe. Dieser Code-Snippet sollte für jede Ebene lxml kehrt in meinem Beispiel 2 Tabellen XML-Parser liefert 0 eine nicht Null Anzahl von Iterationen hat und die Zahl sollte 3Parsing KML mit schöner Suppe

from bs4 import BeautifulSoup 

url = "sample.kml" 

with open(url,'r') as page: 

    soup = BeautifulSoup(page, "lxml") 

    tables = soup.find_all('table') 
    print(len(tables)) 

    for table in tables:  
     rows = table.find_all('tr') 

     for row in rows:  
      cols = row.find_all('td') 

Das erste Beispielskript anstelle von 3 gibt 2 Tabellen verwenden Lxml und 0 mit XML-Parser.

soup = BeautifulSoup(page, "xml") 

    placemark = soup.find_all('Placemark') 
    print(len(placemark)) 

    for place in placemark: 

     tables = place.find_all('table') 
     print(len(tables)) 

     for table in tables:  
      rows = table.find_all('tr') 

      for row in rows:  
       cols = row.find_all('td') 

den Baum durchquert ich ursprünglich für Tabellen begann die Suche, die len (Tabellen) 2 zurück, die ich kenne, falsch sein sollte etwa 92.000 so fand ich einen anderen Tag zu starten Baum Schreiten durch die wurde (richtige Anzahl zurück), und versuchte dann, die Reihen und Spalten innerhalb jedes Etiketts zu finden, von denen sie alle Null zurückgaben, was mich überraschte. Ich spielte mit verschiedenen Parsern herum und stellte schließlich fest, dass xml die richtige war, konnte aber immer noch nicht die richtige Menge an Tabellen finden, obwohl ich sie mit re.search finden oder in erhabenem Text suchen konnte könnte gekapselt sein, aber ohne Erfolg. Ich bin ziemlich fest und scheint einen Weg zu finden, auf die 92.000 Tabellen zuzugreifen, indem ich die find_all ("TAG") Methode benutze. irgendwelche Vorschläge?

Beispiel 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 id="laaSECS" xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd"> 
    <name>laaSECS</name> 
    <Snippet maxLines="0"></Snippet> 
    <Style id="PolyStyle00"> 
     <LabelStyle> 
      <color>00000000</color> 
      <scale>0</scale> 
     </LabelStyle> 
     <LineStyle> 
      <color>ff7f5555</color> 
      <width>0.2</width> 
     </LineStyle> 
     <PolyStyle> 
      <color>ffc5d9fa</color> 
      <fill>0</fill> 
     </PolyStyle> 
    </Style> 
    <Style id="PolyStyle000"> 
     <LabelStyle> 
      <color>00000000</color> 
      <scale>0</scale> 
     </LabelStyle> 
     <LineStyle> 
      <color>ff7f5555</color> 
      <width>0.2</width> 
     </LineStyle> 
     <PolyStyle> 
      <color>ffc5d9fa</color> 
      <fill>0</fill> 
     </PolyStyle> 
    </Style> 
    <StyleMap id="PolyStyle001"> 
     <Pair> 
      <key>normal</key> 
      <styleUrl>#PolyStyle00</styleUrl> 
     </Pair> 
     <Pair> 
      <key>highlight</key> 
      <styleUrl>#PolyStyle000</styleUrl> 
     </Pair> 
    </StyleMap> 
    <Folder id="FeatureLayer0"> 
     <name>laaSECS</name> 
     <Snippet maxLines="0"></Snippet> 
     <Placemark id="ID_00000"> 
      <name>AL</name> 
      <Snippet maxLines="0"></Snippet> 
      <description><![CDATA[<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

<head> 

<META http-equiv="Content-Type" content="text/html"> 

<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 

</head> 

<body style="margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;"> 

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px"> 

<tr style="text-align:center;font-weight:bold;background:#9CBCE2"> 

<td>AL</td> 

</tr> 

<tr> 

<td> 

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px"> 

<tr> 

<td>FID</td> 

<td>0</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>STATE</td> 

<td>AL</td> 

</tr> 

<tr> 

<td>MER</td> 

<td>25</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>TWP</td> 

<td>22</td> 

</tr> 

<tr> 

<td>TDIR</td> 

<td>N</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>RNG</td> 

<td>4</td> 

</tr> 

<tr> 

<td>RDIR</td> 

<td>W</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>SEC</td> 

<td>24</td> 

</tr> 

<tr> 

<td>MODDATE</td> 

<td>20050311</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>DATUM</td> 

<td>NAD27</td> 

</tr> 

<tr> 

<td>SOURCE</td> 

<td>WhiteStar</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>MTR</td> 

<td>25 22.0N 4.0W</td> 

</tr> 

</table> 

</td> 

</tr> 

</table> 

</body> 

</html>]]></description> 
      <styleUrl>#PolyStyle001</styleUrl> 
      <MultiGeometry> 
       <Polygon> 
        <outerBoundaryIs> 
         <LinearRing> 
          <coordinates> 
           -88.35570867858526,32.86011073571817,0 -88.35570870147141,32.86253443065814,0 -88.35597594524225,32.86011537400984,0 -88.35570867858526,32.86011073571817,0 
          </coordinates> 
         </LinearRing> 
        </outerBoundaryIs> 
       </Polygon> 
      </MultiGeometry> 
     </Placemark> 
     <Placemark id="ID_00001"> 
      <name>AL</name> 
      <Snippet maxLines="0"></Snippet> 
      <description><![CDATA[<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

<head> 

<META http-equiv="Content-Type" content="text/html"> 

<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 

</head> 

<body style="margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;"> 

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px"> 

<tr style="text-align:center;font-weight:bold;background:#9CBCE2"> 

<td>AL</td> 

</tr> 

<tr> 

<td> 

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px"> 

<tr> 

<td>FID</td> 

<td>1</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>STATE</td> 

<td>AL</td> 

</tr> 

<tr> 

<td>MER</td> 

<td>25</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>TWP</td> 

<td>22</td> 

</tr> 

<tr> 

<td>TDIR</td> 

<td>N</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>RNG</td> 

<td>4</td> 

</tr> 

<tr> 

<td>RDIR</td> 

<td>W</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>SEC</td> 

<td>25</td> 

</tr> 

<tr> 

<td>MODDATE</td> 

<td>20050311</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>DATUM</td> 

<td>NAD27</td> 

</tr> 

<tr> 

<td>SOURCE</td> 

<td>WhiteStar</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>MTR</td> 

<td>25 22.0N 4.0W</td> 

</tr> 

</table> 

</td> 

</tr> 

</table> 

</body> 

</html>]]></description> 
      <styleUrl>#PolyStyle001</styleUrl> 
      <MultiGeometry> 
       <Polygon> 
        <outerBoundaryIs> 
         <LinearRing> 
          <coordinates> 
           -88.35597594524225,32.86011537400984,0 -88.3567389068841,32.85292852502473,0 -88.35768486975799,32.84508568993779,0 -88.35570853700197,32.84511675513796,0 -88.35570867858526,32.86011073571817,0 -88.35597594524225,32.86011537400984,0 
          </coordinates> 
         </LinearRing> 
        </outerBoundaryIs> 
       </Polygon> 
      </MultiGeometry> 
     </Placemark> 
     <Placemark id="ID_00002"> 
      <name>AL</name> 
      <Snippet maxLines="0"></Snippet> 
      <description><![CDATA[<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

<head> 

<META http-equiv="Content-Type" content="text/html"> 

<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 

</head> 

<body style="margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;"> 

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px"> 

<tr style="text-align:center;font-weight:bold;background:#9CBCE2"> 

<td>AL</td> 

</tr> 

<tr> 

<td> 

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px"> 

<tr> 

<td>FID</td> 

<td>2</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>STATE</td> 

<td>AL</td> 

</tr> 

<tr> 

<td>MER</td> 

<td>25</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>TWP</td> 

<td>22</td> 

</tr> 

<tr> 

<td>TDIR</td> 

<td>N</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>RNG</td> 

<td>4</td> 

</tr> 

<tr> 

<td>RDIR</td> 

<td>W</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>SEC</td> 

<td>36</td> 

</tr> 

<tr> 

<td>MODDATE</td> 

<td>20050311</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>DATUM</td> 

<td>NAD27</td> 

</tr> 

<tr> 

<td>SOURCE</td> 

<td>WhiteStar</td> 

</tr> 

<tr bgcolor="#D4E4F3"> 

<td>MTR</td> 

<td>25 22.0N 4.0W</td> 

</tr> 

</table> 

</td> 

</tr> 

</table> 

</body> 

</html>]]></description> 
      <styleUrl>#PolyStyle001</styleUrl> 
      <MultiGeometry> 
       <Polygon> 
        <outerBoundaryIs> 
         <LinearRing> 
          <coordinates> 
           -88.35768486975799,32.84508568993779,0 -88.35843183642189,32.83843382961495,0 -88.35914980106479,32.83165897171819,0 -88.35908878782671,32.83049899571662,0 -88.35570839957039,32.83056244880483,0 -88.35570853700197,32.84511675513796,0 -88.35768486975799,32.84508568993779,0 
          </coordinates> 
         </LinearRing> 
        </outerBoundaryIs> 
       </Polygon> 
      </MultiGeometry> 
     </Placemark> 
     <Placemark id="ID_00003"> 
      <name>AL</name> 
      <Snippet maxLines="0"></Snippet> 
      <description><![CDATA[<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 

Link zum originalfile KML FILE

+3

Bitte stellen Sie ein kleines XML-Beispiel zur Verfügung, das das Problem veranschaulicht. Eine 175-MB-Datei ist nicht Teil eines [mcve]! – miken32

+0

OK @ miken32 Ich habe es auf 500 Zeilen gebracht –

Antwort

2

Die Wurzel des Problems ist, dass Sie ein XML-Dokument mit verschachtelten HTML-Dokumenten in ihm. Beim Versuch, das Ganze zu analysieren, funktioniert HTML nicht, da die HTML-Dokumente scheinbar als Tag gespeichert sind. Daher ist dies zwar kein gültiger XML-Code, aber kein HTML, das im Remote-Zugriff gültig ist.

Um dies zu beheben, analysierte ich das gesamte Dokument als XML, extrahierte jeden HTML-Teil (als Zeichenfolge) und analysierte dann diesen HTML-Teil als HTML. Beachten Sie, dass, etwas verwirrend, lxml ein HTML-Parser ist, aber lxml-xml ist ein XML-Parser.

from bs4 import BeautifulSoup as Soup 

with open('sample.kml') as data: 
    kml_soup = Soup(data, 'lxml-xml') # Parse as XML 

descriptions = kml_soup.find_all('description') 
for description in descriptions: 
    html_soup = Soup(description.text, 'lxml') # Parse as HTML 
    tables = html_soup.find_all('table') 
    print(len(tables)) 
    for table in tables: 
     rows = table.find_all('tr') 

     for row in rows: 
      cols = row.find_all('td') 
      ... 

Für die von Ihnen zur Verfügung gestellte Probe gab es sechs Tabellen. Der obige Code druckt "2" dreimal, so dass alle sechs gefunden wurden.

+0

Wow Thankyou, was Sie in diese verschachtelte Struktur gekippt habe Ich glaube nicht, dass ich das jemals herausgefunden hätte @ supersam654 –

+1

@TylerCowan Sie können sehen, dass das HTML in einem CDATA-Abschnitt gespeichert ist, Soweit es das XML betrifft, ist es nur Text. Aus diesem Grund ist eine separate Analyse des HTML-Codes erforderlich. – miken32

+0

@ miken32 Danke das war sehr hilfreich –

Verwandte Themen