【问题标题】:Why can't I scrape numbers over 999,999? (XPaths in Python)为什么我不能刮掉超过 999,999 的数字? (Python 中的 XPath)
【发布时间】:2016-04-29 16:32:46
【问题描述】:

我正在尝试从一个网站(代码中的链接)获取前往外国的旅行者数量。出于某种原因,当我实际显示数据时,它会忽略超过 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

【问题讨论】:

  • 因为那些较大的数字在另一个元素中。 <span class="bignum">1,750,000</span>
  • 这是否意味着我无法使用一个 Xpath 获取所有数字?
  • 我对 XPath 不太熟悉,但好像很熟悉
  • 您可以在 xpath 中使用 or
  • @PadraicCunningham 感谢您的帮助!想通了!

标签: python parsing xpath web-scraping


【解决方案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

【讨论】:

    【解决方案2】:

    cricket_007Padraic Cunningham 的 cmets 放在一起 您可以尝试以下 xpath:

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

    【讨论】:

    • 我想通了,但这与我得到的非常接近。谢谢你的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多