2016-04-29 1 views
0

Ich versuche, die Anzahl der Reisenden ins Ausland von einer Website (Link in Code) zu kratzen. Aus irgendeinem Grund, wenn ich die Daten tatsächlich bekomme, ignoriert es eine Zahl über 999.999. Vielleicht kann jemand sehen, was ich hier vermisse.Warum kann ich nicht Zahlen über 999.999 kratzen? (XPaths in Python)

import requests 
    from lxml import html 
    import csv 
    import pandas as pd 
    import re 

    r = requests.get('http://data.worldbank.org/indicator/ST.INT.ARVL/countries/1W  page=4&order=wbapi_data_value_2014%20wbapi_data_value%20wbapi_data_value- last&sort=asc&display=default') 
    data = html.fromstring(r.text) 

    Data1995 = [] 
    Data_1995 = data.xpath("//tbody/tr[td]/td[2]/text()") 

    for i in Data_1995: 
     i = i.encode('ascii','ignore').strip() 
     i = re.sub('[()]', '', i) # removing() 
     Data1995.append(i) 

    Data1995 
+0

Weil diese größeren Zahlen in einem anderen Element sind. ' 1,750,000' –

+0

Bedeutet das, dass es mir nicht möglich sein wird, alle Zahlen mit einem Xpath zu bekommen? –

+0

Ich bin nicht vertraut mit XPath, aber es scheint so –

Antwort

0

Setzt man die Kommentare von cricket_007 und Padraic zusammen Cunningham Sie können die folgende XPath versuchen:

//tbody/tr[td]/td[2][not(span)]/text() | 
//tbody/tr[td]/td[2]/span/text() 
+0

Ich habe es herausgefunden, aber das ist sehr nah an dem, was ich bekommen habe. Danke für den Vorschlag! –

1

Ein anderer Ansatz:

Data1995 = [] 

for elem in data.xpath("//tbody/tr[td]/td[2]"): 
    i = elem.xpath("string(.)") 
    i = i.encode('ascii','ignore').strip() 
    i = re.sub('[()]', '', i) # removing() 
    Data1995.append(i) 

Weglassen des text() Schritt aus Der XPath-Ausdruck gibtzurückElemente. Dann extrahiert elem.xpath("string(.)") das string-value von jedem td Element. Für element nodes ist der Zeichenfolgenwert "die Verkettung der Zeichenfolgenwerte aller untergeordneten Textknotenknoten des Elementknotens in der Dokumentreihenfolge."

Ich empfehle diese Technik im Allgemeinen, da es viel robuster ist. Nehmen Sie das folgende td Element, zum Beispiel:

<td>A <i>simple</i> example</td> 

td/text() Auswahl wird wieder zwei Textknoten enthält A und example. Normalerweise ist dies nicht das, was Sie wollen. Der von mir beschriebene Ansatz gibt A simple example zurück.