为什么我不能刮掉超过999,999的数字? (Python中的XPath)

时间:2016-04-29 16:32:46

标签: python parsing xpath web-scraping

我正试图从一个站点(代码中的链接)刮去到国外的旅行者数量。出于某种原因,当我实际显示数据时,它会忽略任何超过999,999的数字。也许有人可以发现我在这里缺少的东西。

    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

2 个答案:

答案 0 :(得分:1)

另一种方法:

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)

从XPath表达式中省略text()步骤将返回td个元素。然后elem.xpath("string(.)")提取每个td元素的string-value。对于element nodes,字符串值“是文档顺序中元素节点的所有文本节点后代的字符串值的串联。”

我推荐这种技术,因为它更加强大。请使用以下td元素,例如:

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

选择td/text()将返回包含Aexample的两个文本节点。通常,这不是你想要的。我描述的方法返回A simple example

答案 1 :(得分:0)

汇总来自 cricket_007 Padraic Cunningham 的评论 您可以尝试以下xpath:

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