Trädvy Permalänk
Medlem
Registrerad
Jun 2012

python html parser

Tjena behöver lite hjälp med HTML parsing med python

from html import parser class MyHTMLParser(parser): container = "" def handle_data(self, data): self.container += data return self.container h = MyHTMLParser() h.feed(my_directions)

Använder python 3.4 och har varit o kollat i lib o namnen stämmer med importsen men får fortfarande:
Traceback (most recent call last):
File "C:/Python34/parse.py", line 4, in <module>
class MyHTMLParser(parser):
File "C:/Python34/parse.py", line 10, in MyHTMLParser
h = MyHTMLParser()
NameError: name 'MyHTMLParser' is not defined

Undrar då om någon vet vad som är fel

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Forumledare
Registrerad
Okt 2002

Så som din indentering är för tillfället så försöker du till klassen MyHTMLParser skapa ett klassattribut h, som i sig ska peka på en instans av samma klass. Det är högst troligen inte vad du vill, och problemet är explicit att klassen MyHTMLParser inte definierats klart när du försöker binda detta attribut till en ny instans av densamma, vilket är varför Python klagar på att klassen inte är definierad (varje "top level"-rad i en klassdefinition exekverar redan vid kompileringssteget).

Du kan börja med att ta bort indenteringen för dina sista två rader och lägga dessa utanför klassdefinitionen för att bli av med kompileringsfelet. Det kommer säkert ge fler felmeddelanden (exempelvis ser variabeln my_directions typiskt odefinierad ut) och kanske fortfarande inte göra vad du vill, men det är inte lätt att veta vad du vill utifrån vad som visats här .

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Trädvy Permalänk
Medlem
Registrerad
Jun 2012
Skrivet av phz:

Så som din indentering är för tillfället så försöker du till klassen MyHTMLParser skapa ett klassattribut h, som i sig ska peka på en instans av samma klass. Det är högst troligen inte vad du vill, och problemet är explicit att klassen MyHTMLParser inte definierats klart när du försöker binda detta attribut till en ny instans av densamma, vilket är varför Python klagar på att klassen inte är definierad (varje "top level"-rad i en klassdefinition exekverar redan vid kompileringssteget).

Du kan börja med att ta bort indenteringen för dina sista två rader och lägga dessa utanför klassdefinitionen för att bli av med kompileringsfelet. Det kommer säkert ge fler felmeddelanden (exempelvis ser variabeln my_directions typiskt odefinierad ut) och kanske fortfarande inte göra vad du vill, men det är inte lätt att veta vad du vill utifrån vad som visats här .

Okej är ny med python och försöker fixa ihop något med google maps api till python. Har fixat de du sa men får nu ett nytt felmedelande.

import googlemaps from html import parser class MyHTMLParser(parser): container = "" def handle_data(self, data): self.container += data return self.container h = MyHTMLParser() h.feed(my_directions) gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') my_distance = gmaps.distance_matrix('Chicago', 'New York City') my_directions = gmaps.directions('Karlskrona', 'Halmstad') print (h.container) print(my_distance)

Traceback (most recent call last):
File "C:/Python34/parser.py", line 5, in <module>
class MyHTMLParser(parser):
TypeError: module.__init__() takes at most 2 arguments (3 given)

Jag vet inte riktigt hur vad som menas med att jag ger den 3 argument, när jag bara skrivit med parser. Oerhört tacksam för hjälpen

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Mar 2002

@turbogeten
parser är en modul, inte en klass.
Så just nu försöker din klass MyHTMLParser ärva från hela modulen parser, det du nog egenteligen vill göra är dock att ärva från klassen html.parser.HTMLParser.
Så ändra till:

... from html.parser import HTMLParser class MyHTMLParser(HTMLParser): ...

The difference between stupidity and genius - the latter has limits

Trädvy Permalänk
Medlem
Registrerad
Jun 2012
Skrivet av Zevon:

@turbogeten
parser är en modul, inte en klass.
Så just nu försöker din klass MyHTMLParser ärva från hela modulen parser, det du nog egenteligen vill göra är dock att ärva från klassen html.parser.HTMLParser.
Så ändra till:

... from html.parser import HTMLParser class MyHTMLParser(HTMLParser): ...

Okej tack, får nu:
Traceback (most recent call last):
File "C:\Python34\parser.py", line 23, in <module>
h.feed(my_directions)
File "C:\Python34\lib\html\parser.py", line 164, in feed
self.rawdata = self.rawdata + data
TypeError: Can't convert 'list' object to str implicitly

Antar de är begränsing mellan google maps api o parsern. Och att de inte går att lösa på detta sätt. Skickar med kod ifall det finns något som ser tokigt ut. Om ni vet något annat sätt att få ut snygg text ifrån google maps api:ns directions får ni gärna dela med er av det med.

import googlemaps from html.parser import HTMLParser gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') my_distance = gmaps.distance_matrix('Chicago', 'New York City') my_directions = gmaps.directions('Karlskrona', 'Halmstad') class MyHTMLParser(HTMLParser): container = "" def handle_data(self, data): self.container += data return self.container h = MyHTMLParser() h.feed(my_directions) print (h.container) print(my_distance)

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Forumledare
Registrerad
Okt 2002
Skrivet av turbogeten:

Okej tack, får nu:
Traceback (most recent call last):
File "C:\Python34\parser.py", line 23, in <module>
h.feed(my_directions)
File "C:\Python34\lib\html\parser.py", line 164, in feed
self.rawdata = self.rawdata + data
TypeError: Can't convert 'list' object to str implicitly

Antar de är begränsing mellan google maps api o parsern.

Om du läser i dokumentationen för html.parser.HTMLParser så ser du dels ett exempel på hur klassen används, och dels att dess feed-metod tar en sträng som input. Du försöker skicka in my_directions, som är en lista (det kan vi antingen kontrollera själva, eller läsa dokumentationen för modulen), och det går inte för sig, precis som Python säger:

TypeError: Can't convert 'list' object to str implicitly

Det går inte att blint tolka en lista som en sträng.

För att få en bild av hur dataformatet du hämtar ser ut så kan vi skriva ut det:

>>> import googlemaps >>> gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') >>> my_directions = gmaps.directions('Karlskrona', 'Halmstad') >>> from pprint import pprint >>> pprint(my_directions) [{'bounds': {'northeast': {'lat': 56.67478910000001, 'lng': 15.6156104}, 'southwest': {'lat': 56.1607924, 'lng': 12.8582172}}, 'copyrights': 'Map data ©2015 Google', 'legs': [{'distance': {'text': '212 km', 'value': 212390}, 'duration': {'text': '2 hours 47 mins', 'value': 10017}, 'end_address': 'Halmstad, Sweden', 'end_location': {'lat': 56.6743775, 'lng': 12.8582172}, 'start_address': 'Karlskrona, Sweden', 'start_location': {'lat': 56.1612464, 'lng': 15.5862243}, 'steps': [{'distance': {'text': '46 m', 'value': 46}, 'duration': {'text': '1 min', 'value': 12}, 'end_location': {'lat': 56.16083, 'lng': 15.5861798}, 'html_instructions': 'Head <b>south</b> toward ' '<b>Stortorget</b>', 'polyline': {'points': 'y~wuI{dc~ArAF'}, 'start_location': {'lat': 56.1612464, 'lng': 15.5862243}, 'travel_mode': 'DRIVING'}, {'distance': {'text': '0.2 km', 'value': 242}, 'duration': {'text': '1 min', 'value': 66}, 'end_location': {'lat': 56.1614567, 'lng': 15.5886974}, 'html_instructions': 'Turn <b>left</b> onto ' '<b>Stortorget</b>', 'maneuver': 'turn-left', 'polyline': {'points': 'e|wuIsdc~A@o@?w@DsCF{Fs@m@WAQAo@p@'}, 'start_location': {'lat': 56.16083, 'lng': 15.5861798}, 'travel_mode': 'DRIVING'}, {'distance': {'text': '0.6 km', 'value': 631}, 'duration': {'text': '2 mins', 'value': 137}, 'end_location': {'lat': 56.1671299, 'lng': 15.5889503}, 'html_instructions': 'Slight <b>right</b> onto ' '<b>Norra Smedjegatan</b>', 'maneuver': 'turn-slight-right', 'polyline': {'points': 'c`xuIktc~AyBCeB?{FM{DEs@CwACwDEqCK'}, 'start_location': {'lat': 56.1614567, 'lng': 15.5886974}, 'travel_mode': 'DRIVING'}, # 256 rader borttagna för forumets skull… {'distance': {'text': '68 m', 'value': 68}, 'duration': {'text': '1 min', 'value': 16}, 'end_location': {'lat': 56.6749103, 'lng': 12.8584486}, 'html_instructions': 'Turn <b>left</b> onto ' '<b>Klammerdammsgatan</b><div ' 'style="font-size:0.9em">Restricted ' 'usage road</div>', 'maneuver': 'turn-left', 'polyline': {'points': 'mh|xIcsnmAEt@OlCAT'}, 'start_location': {'lat': 56.67478910000001, 'lng': 12.8595423}, 'travel_mode': 'DRIVING'}, {'distance': {'text': '61 m', 'value': 61}, 'duration': {'text': '1 min', 'value': 15}, 'end_location': {'lat': 56.6743775, 'lng': 12.8582172}, 'html_instructions': 'Turn <b>left</b> onto ' '<b>Storgatan</b><div ' 'style="font-size:0.9em">Restricted ' 'usage road</div>', 'maneuver': 'turn-left', 'polyline': {'points': 'ei|xIilnmA|Aj@J@'}, 'start_location': {'lat': 56.6749103, 'lng': 12.8584486}, 'travel_mode': 'DRIVING'}], 'via_waypoint': []}], 'overview_polyline': {'points': 'y~wuI{dc~AzAsFuAmHk_@JaEfG{LyBw[mz@_Uy{@qUwRgOqEqR{Wy]tMsPbEwDkB_d@hi@_f@`SuL~NqTfp@Dl`ApTduBfB`vB|Gx}@jIxv@~Rpq@~LjfB~Hdn@lGlnAtIr{De@zw@eJliB}Fr~BA`rBgC~sAyQ|pBgLjsBcKfn@m^`{@mP`{ByOxt@{Thj@oj@nxAoJn_Am@b}@tGffAjN|x@zg@ddChL|z@xA~t@{Hn|BsKtyBfC`yBlx@dfF~UnrBiEnvBvAnv@bL|v@jHvv@Pj}@bAhfBjGnz@jPp`Aji@zbBfNpu@rEfx@rF~|CbDrzAyXtdAeFx^|E||ApUxpDxGz~@cBnpAiCbmAkKl}@Ixm@dKnm@bWv{@h_@t_BfDvq@mC~aAvPdnBnClqCpDp|@`Mhr@nQre@fCfOga@zhDoK~b@_kAdqCsQte@}c@x^kjAvwAqg@|}@mZxpAub@ptB{QzQc[tHmV|UmK|D_b@jN_aAro@_WhKco@z[aRxF}}@hKkn@~Hcl@gDak@kVyMtE{MfRkd@|l@czB~_Bi_@bBig@jf@ga@`Pi`@rMwi@tf@cb@`Tea@bIc`@vFk]~d@qZtYyMxPwH|YuBxzAnBxkAxHbkBkKzlBkLtw@nEjg@pW`ZfBfNeO`x@uJtpDc`@l`Aj@~MfDlNdQ|_@pB|l@i@rrA`Jhr@pYhm@fa@hu@zYfeAvBdJsEv]MxYuJjuAqIjt@fCnjAnIhaAmJ~{@{CjxA|@~|BbGvt@fAbtA~Afq@eQl}@yXrnBoe@`oBz@|`@bKviAxDtvBDlb@pAr[vVzpDv@ho@ID@d@yf@buCo_@hhAcqA|xCkb@hfAoKznAyRjcBcYddAu_@to@iPjk@eF|mAoOrhAc^b_AgQhu@iZ~qE{i@||Bc@rjA`MpaBwDvyC{CxwCiLzbCi@je@qEngAgz@hfCeKj]s_@n~BwCjz@xA|_@|YzpB|ApyA{NpsEqQr}BfArlAkJnl@uhAnhBeOhd@}L`vADpc@`TjeAhQ~_AwD||@m\\||Cq_@tnB__AnyE__@`cCuM`y@gE|`AmSlpCcNp{BkRxn@sWfcB`DpjB`MdcA|Izy@oBht@gI`l@qPj`@s\\~`@uOre@{Mho@gKt~A}AxbEwEvrD`@z|AgQdn@wPzYa|Ar}Bsl@lj@cR~]qOlj@an@|xAocAhwBwd@h{@ef@xr@_ZzL_TiGoVx@qLpJs`@lxAaj@rv@ik@dt@mq@dg@}IxOkqAz~Dkq@~xBe@`KaFDwFdJpAfG'}, 'summary': 'E22 and Route 15', 'warnings': [], 'waypoint_order': []}]

Dold text

Det är alltså inte precis bara en enkel sträng där väganvisningar står i klartext, utan snarare en lista nästlad med listor, dictionaries och strängar.

För att få mer information om det dataformat som Google returnerar så kan man läsa dokumentationen för "Google Maps Directions API".

Ett exempel för att enbart få ut HTML-väganvisningarna för det första ruttförslaget vore:

>>> import googlemaps >>> gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') >>> my_directions = gmaps.directions('Karlskrona', 'Halmstad') >>> steps = my_directions[0]['legs'][0]['steps'] >>> print('\n'.join(step['html_instructions'] for step in steps)) Head <b>south</b> toward <b>Stortorget</b> Turn <b>left</b> onto <b>Stortorget</b> Slight <b>right</b> onto <b>Norra Smedjegatan</b> Turn <b>left</b> onto <b>Skeppsbrokajen</b> Turn <b>right</b> onto <b>Österleden/Route 28</b> Take the exit toward <b>Malmö/Ronneby/Göteborg</b> Continue onto <b>Sunnavägen</b> At the roundabout, take the <b>2nd</b> exit onto <b>Ronnebyvägen</b> Merge onto <b>E22</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>E22</b> Exit onto <b>Pukaviksvägen/Route 15</b><div style="font-size:0.9em">Continue to follow Route 15</div> At the roundabout, take the <b>2nd</b> exit onto <b>Pukaviksvägen/Route 15</b><div style="font-size:0.9em">Continue to follow Route 15</div> Turn <b>right</b> to stay on <b>Route 15</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> Continue onto <b>Ågatan/Route 15</b><div style="font-size:0.9em">Continue to follow Route 15</div> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> Continue onto <b>Laholmsvägen</b> Continue onto <b>Viktoriagatan</b> Slight <b>right</b> to stay on <b>Viktoriagatan</b> Turn <b>right</b> onto <b>Strandgatan</b> Turn <b>left</b> to stay on <b>Strandgatan</b><div style="font-size:0.9em">Parts of this road are closed Sat–Sun 12:00 – 4:00 am</div> <b>Strandgatan</b> turns <b>left</b> and becomes <b>Österbro</b> Turn <b>right</b> onto <b>Hamngatan</b> Turn <b>left</b> onto <b>Klammerdammsgatan</b><div style="font-size:0.9em">Restricted usage road</div> Turn <b>left</b> onto <b>Storgatan</b><div style="font-size:0.9em">Restricted usage road</div>

Hur långt du ska köra på varje sträcka, hur lång tid det tar, etc., är ju just den extra information som gör att strukturen är mer komplex än "bara en sträng". Det är bara att hantera som du vill.

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Trädvy Permalänk
Medlem
Registrerad
Jun 2012
Skrivet av phz:

Om du läser i dokumentationen för html.parser.HTMLParser så ser du dels ett exempel på hur klassen används, och dels att dess feed-metod tar en sträng som input. Du försöker skicka in my_directions, som är en lista (det kan vi antingen kontrollera själva, eller läsa dokumentationen för modulen), och det går inte för sig, precis som Python säger:

TypeError: Can't convert 'list' object to str implicitly

Det går inte att blint tolka en lista som en sträng.

För att få en bild av hur dataformatet du hämtar ser ut så kan vi skriva ut det:

>>> import googlemaps >>> gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') >>> my_directions = gmaps.directions('Karlskrona', 'Halmstad') >>> from pprint import pprint >>> pprint(my_directions) [{'bounds': {'northeast': {'lat': 56.67478910000001, 'lng': 15.6156104}, 'southwest': {'lat': 56.1607924, 'lng': 12.8582172}}, 'copyrights': 'Map data ©2015 Google', 'legs': [{'distance': {'text': '212 km', 'value': 212390}, 'duration': {'text': '2 hours 47 mins', 'value': 10017}, 'end_address': 'Halmstad, Sweden', 'end_location': {'lat': 56.6743775, 'lng': 12.8582172}, 'start_address': 'Karlskrona, Sweden', 'start_location': {'lat': 56.1612464, 'lng': 15.5862243}, 'steps': [{'distance': {'text': '46 m', 'value': 46}, 'duration': {'text': '1 min', 'value': 12}, 'end_location': {'lat': 56.16083, 'lng': 15.5861798}, 'html_instructions': 'Head <b>south</b> toward ' '<b>Stortorget</b>', 'polyline': {'points': 'y~wuI{dc~ArAF'}, 'start_location': {'lat': 56.1612464, 'lng': 15.5862243}, 'travel_mode': 'DRIVING'}, {'distance': {'text': '0.2 km', 'value': 242}, 'duration': {'text': '1 min', 'value': 66}, 'end_location': {'lat': 56.1614567, 'lng': 15.5886974}, 'html_instructions': 'Turn <b>left</b> onto ' '<b>Stortorget</b>', 'maneuver': 'turn-left', 'polyline': {'points': 'e|wuIsdc~A@o@?w@DsCF{Fs@m@WAQAo@p@'}, 'start_location': {'lat': 56.16083, 'lng': 15.5861798}, 'travel_mode': 'DRIVING'}, {'distance': {'text': '0.6 km', 'value': 631}, 'duration': {'text': '2 mins', 'value': 137}, 'end_location': {'lat': 56.1671299, 'lng': 15.5889503}, 'html_instructions': 'Slight <b>right</b> onto ' '<b>Norra Smedjegatan</b>', 'maneuver': 'turn-slight-right', 'polyline': {'points': 'c`xuIktc~AyBCeB?{FM{DEs@CwACwDEqCK'}, 'start_location': {'lat': 56.1614567, 'lng': 15.5886974}, 'travel_mode': 'DRIVING'}, # 256 rader borttagna för forumets skull… {'distance': {'text': '68 m', 'value': 68}, 'duration': {'text': '1 min', 'value': 16}, 'end_location': {'lat': 56.6749103, 'lng': 12.8584486}, 'html_instructions': 'Turn <b>left</b> onto ' '<b>Klammerdammsgatan</b><div ' 'style="font-size:0.9em">Restricted ' 'usage road</div>', 'maneuver': 'turn-left', 'polyline': {'points': 'mh|xIcsnmAEt@OlCAT'}, 'start_location': {'lat': 56.67478910000001, 'lng': 12.8595423}, 'travel_mode': 'DRIVING'}, {'distance': {'text': '61 m', 'value': 61}, 'duration': {'text': '1 min', 'value': 15}, 'end_location': {'lat': 56.6743775, 'lng': 12.8582172}, 'html_instructions': 'Turn <b>left</b> onto ' '<b>Storgatan</b><div ' 'style="font-size:0.9em">Restricted ' 'usage road</div>', 'maneuver': 'turn-left', 'polyline': {'points': 'ei|xIilnmA|Aj@J@'}, 'start_location': {'lat': 56.6749103, 'lng': 12.8584486}, 'travel_mode': 'DRIVING'}], 'via_waypoint': []}], 'overview_polyline': {'points': 'y~wuI{dc~AzAsFuAmHk_@JaEfG{LyBw[mz@_Uy{@qUwRgOqEqR{Wy]tMsPbEwDkB_d@hi@_f@`SuL~NqTfp@Dl`ApTduBfB`vB|Gx}@jIxv@~Rpq@~LjfB~Hdn@lGlnAtIr{De@zw@eJliB}Fr~BA`rBgC~sAyQ|pBgLjsBcKfn@m^`{@mP`{ByOxt@{Thj@oj@nxAoJn_Am@b}@tGffAjN|x@zg@ddChL|z@xA~t@{Hn|BsKtyBfC`yBlx@dfF~UnrBiEnvBvAnv@bL|v@jHvv@Pj}@bAhfBjGnz@jPp`Aji@zbBfNpu@rEfx@rF~|CbDrzAyXtdAeFx^|E||ApUxpDxGz~@cBnpAiCbmAkKl}@Ixm@dKnm@bWv{@h_@t_BfDvq@mC~aAvPdnBnClqCpDp|@`Mhr@nQre@fCfOga@zhDoK~b@_kAdqCsQte@}c@x^kjAvwAqg@|}@mZxpAub@ptB{QzQc[tHmV|UmK|D_b@jN_aAro@_WhKco@z[aRxF}}@hKkn@~Hcl@gDak@kVyMtE{MfRkd@|l@czB~_Bi_@bBig@jf@ga@`Pi`@rMwi@tf@cb@`Tea@bIc`@vFk]~d@qZtYyMxPwH|YuBxzAnBxkAxHbkBkKzlBkLtw@nEjg@pW`ZfBfNeO`x@uJtpDc`@l`Aj@~MfDlNdQ|_@pB|l@i@rrA`Jhr@pYhm@fa@hu@zYfeAvBdJsEv]MxYuJjuAqIjt@fCnjAnIhaAmJ~{@{CjxA|@~|BbGvt@fAbtA~Afq@eQl}@yXrnBoe@`oBz@|`@bKviAxDtvBDlb@pAr[vVzpDv@ho@ID@d@yf@buCo_@hhAcqA|xCkb@hfAoKznAyRjcBcYddAu_@to@iPjk@eF|mAoOrhAc^b_AgQhu@iZ~qE{i@||Bc@rjA`MpaBwDvyC{CxwCiLzbCi@je@qEngAgz@hfCeKj]s_@n~BwCjz@xA|_@|YzpB|ApyA{NpsEqQr}BfArlAkJnl@uhAnhBeOhd@}L`vADpc@`TjeAhQ~_AwD||@m\\||Cq_@tnB__AnyE__@`cCuM`y@gE|`AmSlpCcNp{BkRxn@sWfcB`DpjB`MdcA|Izy@oBht@gI`l@qPj`@s\\~`@uOre@{Mho@gKt~A}AxbEwEvrD`@z|AgQdn@wPzYa|Ar}Bsl@lj@cR~]qOlj@an@|xAocAhwBwd@h{@ef@xr@_ZzL_TiGoVx@qLpJs`@lxAaj@rv@ik@dt@mq@dg@}IxOkqAz~Dkq@~xBe@`KaFDwFdJpAfG'}, 'summary': 'E22 and Route 15', 'warnings': [], 'waypoint_order': []}]

Dold text

Det är alltså inte precis bara en enkel sträng där väganvisningar står i klartext, utan snarare en lista nästlad med listor, dictionaries och strängar.

För att få mer information om det dataformat som Google returnerar så kan man läsa dokumentationen för "Google Maps Directions API".

Ett exempel för att enbart få ut HTML-väganvisningarna för det första ruttförslaget vore:

>>> import googlemaps >>> gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') >>> my_directions = gmaps.directions('Karlskrona', 'Halmstad') >>> steps = my_directions[0]['legs'][0]['steps'] >>> print('\n'.join(step['html_instructions'] for step in steps)) Head <b>south</b> toward <b>Stortorget</b> Turn <b>left</b> onto <b>Stortorget</b> Slight <b>right</b> onto <b>Norra Smedjegatan</b> Turn <b>left</b> onto <b>Skeppsbrokajen</b> Turn <b>right</b> onto <b>Österleden/Route 28</b> Take the exit toward <b>Malmö/Ronneby/Göteborg</b> Continue onto <b>Sunnavägen</b> At the roundabout, take the <b>2nd</b> exit onto <b>Ronnebyvägen</b> Merge onto <b>E22</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>E22</b> Exit onto <b>Pukaviksvägen/Route 15</b><div style="font-size:0.9em">Continue to follow Route 15</div> At the roundabout, take the <b>2nd</b> exit onto <b>Pukaviksvägen/Route 15</b><div style="font-size:0.9em">Continue to follow Route 15</div> Turn <b>right</b> to stay on <b>Route 15</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> Continue onto <b>Ågatan/Route 15</b><div style="font-size:0.9em">Continue to follow Route 15</div> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> At the roundabout, take the <b>2nd</b> exit and stay on <b>Route 15</b> Continue onto <b>Laholmsvägen</b> Continue onto <b>Viktoriagatan</b> Slight <b>right</b> to stay on <b>Viktoriagatan</b> Turn <b>right</b> onto <b>Strandgatan</b> Turn <b>left</b> to stay on <b>Strandgatan</b><div style="font-size:0.9em">Parts of this road are closed Sat–Sun 12:00 – 4:00 am</div> <b>Strandgatan</b> turns <b>left</b> and becomes <b>Österbro</b> Turn <b>right</b> onto <b>Hamngatan</b> Turn <b>left</b> onto <b>Klammerdammsgatan</b><div style="font-size:0.9em">Restricted usage road</div> Turn <b>left</b> onto <b>Storgatan</b><div style="font-size:0.9em">Restricted usage road</div>

Hur långt du ska köra på varje sträcka, hur lång tid det tar, etc., är ju just den extra information som gör att strukturen är mer komplex än "bara en sträng". Det är bara att hantera som du vill.

Tack, de funka skit bra. Har bara liten fundering runt, steps = my_directions[0]['legs'][0]['steps']
är detta något från python eller är den syntaxen specifik för google maps. Är ny till python och har inte hittat något om dessa 3 [] är de listor man pratar om?

{ "destination_addresses" : [ "San Francisco, Californie, États-Unis", "Victoria, BC, Canada" ], "origin_addresses" : [ "Vancouver, BC, Canada", "Seattle, Washington, États-Unis" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "1 706 km", "value" : 1705627 }, "duration" : { "text" : "3 jours 19 heures", "value" : 327061 }, "status" : "OK" }, { "distance" : { "text" : "139 km", "value" : 138549 }, "duration" : { "text" : "6 heures 42 minutes", "value" : 24146 }, "status" : "OK" } ] }, { "elements" : [ { "distance" : { "text" : "1 449 km", "value" : 1449084 }, "duration" : { "text" : "3 jours 4 heures", "value" : 274649 }, "status" : "OK" }, { "distance" : { "text" : "146 km", "value" : 146496 }, "duration" : { "text" : "2 heures 52 minutes", "value" : 10324 }, "status" : "OK" } ] } ], "status" : "OK" }

Detta är utskriften från distance, direction är fixad. Men så om jag använder [0]['rows'] betyder det att jag kollar första plats i rows? Och där ligger elements, så om jag skriver [0]['elements'] så får jag ut distance? Jag har ingen aning måste kolla upp listor i python.

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Forumledare
Registrerad
Okt 2002
Skrivet av turbogeten:

Tack, de funka skit bra. Har bara liten fundering runt, steps = my_directions[0]['legs'][0]['steps']
är detta något från python eller är den syntaxen specifik för google maps. Är ny till python och har inte hittat något om dessa 3 [] är de listor man pratar om?

Hakparenteser används för att specificera index i Python (och de flesta andra språk, med vissa variationer) för både

  • sekvenser (exempelvis strängar, listor, tuplar) via numeriska index och

  • mappningar (exempelvis dictionaries) via mer godtyckliga (hashbara) index (snarare kallade "nycklar" i detta fall).

Listor respektive dictionaries skapas i Python med dess inbyggda "snabbsyntax" likt:

min_lista = [listelement_1, listelement_2, listelement_3] min_dictionary = {'dictindex_1': dictelement_1, 'dictindex_2': dictelement_2, 'dictindex_3': dictelement_3}

dvs

  • hakparenteser med en kommaseparerad uppräkning av värden för att skapa en lista

  • måsvingar med en kommaseparerad uppräkning av nyckel: värde-poster för att skapa en dictionary.

I utskriften av datastrukturen my_directions såg man genom att studera hakparenteser och måsvingar att

  1. det var en lista där vi ville titta på första elementet (index 0 enligt gammal konvention)

  2. som var en dictionary där vi ville titta på värdet tillhörande nyckeln 'legs'

  3. som pekade på en lista där vi ville titta på första elementet (index 0 enligt gammal konvention)

  4. som var en dictionary där vi ville titta på värdet tillhörande nyckeln 'steps'

  5. som gav ytterligare en lista som vi senare kunde behandla vidare i nästa steg.

Vi kontrollerar:

>>> import googlemaps >>> gmaps = googlemaps.Client(key='AIzaSyCWc412ea7lCr1A96bUnKbcIsEEh6FOz-g') >>> my_directions = gmaps.directions('Karlskrona', 'Halmstad') >>> type(my_directions) <class 'list'> >>> type(my_directions[0]) <class 'dict'> >>> type(my_directions[0]['legs']) <class 'list'> >>> type(my_directions[0]['legs'][0]) <class 'dict'> >>> type(my_directions[0]['legs'][0]['steps']) <class 'list'>

När vi lägger på fler hakparanteser på my_directions så vandrar vi alltså bara längre och längre ned i strukturen.

Hur de inbyggda datatyperna fungerar grovt är ett av de allra första stegen att lära sig för att förstå någon Python-kod, så om det inte sitter så se till att köra genom grunderna.

Skrivet av turbogeten:

{ "destination_addresses" : [ "San Francisco, Californie, États-Unis", "Victoria, BC, Canada" ], "origin_addresses" : [ "Vancouver, BC, Canada", "Seattle, Washington, États-Unis" ], "rows" : [ { "elements" : [ { "distance" : { "text" : "1 706 km", "value" : 1705627 }, "duration" : { "text" : "3 jours 19 heures", "value" : 327061 }, "status" : "OK" }, { "distance" : { "text" : "139 km", "value" : 138549 }, "duration" : { "text" : "6 heures 42 minutes", "value" : 24146 }, "status" : "OK" } ] }, { "elements" : [ { "distance" : { "text" : "1 449 km", "value" : 1449084 }, "duration" : { "text" : "3 jours 4 heures", "value" : 274649 }, "status" : "OK" }, { "distance" : { "text" : "146 km", "value" : 146496 }, "duration" : { "text" : "2 heures 52 minutes", "value" : 10324 }, "status" : "OK" } ] } ], "status" : "OK" }

Detta är utskriften från distance, direction är fixad. Men så om jag använder [0]['rows'] betyder det att jag kollar första plats i rows? Och där ligger elements, så om jag skriver [0]['elements'] så får jag ut distance?

Måsvingar i utskriften pekar på att något är en dictionary; hakparenteser att något är en lista. För att nå exempelvis strängen '6 heures 42 minutes' i ovanstående struktur med namn my_distances så får man gå enligt:

my_distances['rows'][0]['elements'][1]['duration']['text']

Skrivet av turbogeten:

Jag har ingen aning måste kolla upp listor i python.

Listor och dictionaries, tuplar, strängar och gärna andra inbyggda datatyper (finns inte jättemånga) behöver man plugga in. Därefter kan man gå vidare med att titta på hur man loopar över dessa strukturer, och sedan är man på god väg att lära sig tänka i Python!

Mer färg!

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Trädvy Permalänk
Medlem
Registrerad
Jun 2012

@phz:
Du är underbar, tack så mycket för hjälpen. Detta kommer hjälpa mig enormt

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |