【问题标题】:Xpath extract dates between certain characters AND use as datesXpath 在某些字符之间提取日期并用作日期
【发布时间】:2015-09-14 16:45:42
【问题描述】:

更新:关于我的第二个问题(如何在 MySQL 中将字符串转换为日期格式),我找到了一种方法并想分享它:

1) 将“字符串日期”数据另存为 VARCHAR(不要使用 TEXT)

2) 用PHP或其他方式展示MySQL数据时,使用str_to_date(string-date-column, date-format)的函数,例如如下示例:

$sql = "SELECT * FROM yourtablename ORDER BY str_to_date(string-date-column, '%d %M %Y')";

我正在使用 scrapy 收集数据,写入数据库。从一个网站上,每个项目的发布日期如下:

<p>   #This is the last <p> within each <div>
<br>
[15 May 2015, #9789]
<br>
</p>

所以日期总是在“[”之后和“,”之前。我使用以下xpath代码提取:

sel.xpath("p[last()]/text()[contains(., '[')]").extract()

但我会得到整行:

[15 May 2015, #9789]

那么,如何只获取“15 May 2015”的部分?如果可以做到这一点,如何将抓取的字符串(2015 年 5 月 15 日)转换为真实的 DATE 数据,以便用于排序?非常感谢!

【问题讨论】:

    标签: python xpath web-scraping scrapy


    【解决方案1】:

    关于第一个问题,假设一次最多有一个日期,您可以使用XPath substring-after()substring-before() 函数的组合来获取文本节点的15 May 2015 部分:

    substring-before(substring-after(p[last()]/text()[contains(., '[')], '['), ',')
    

    关于第二个问题,可以使用datetime.strptime()将字符串转换为datetime

    import datetime
    
    result = datetime.datetime.strptime("15 May 2015", "%d %b %Y")
    print(result)
    print(type(result))
    

    输出:

    2015-05-15 00:00:00
    <type 'datetime.datetime'>
    

    【讨论】:

    • 问题的第二部分是answered here
    • 在尝试使用 datetime 函数时,我收到以下错误消息:“exceptions.ValueError: time data "[u'15 May 2015']" does not match format '%d-%b -%Y'”。是不是因为Scrapy在“15 May 2015”的抓取字符串前后添加了特殊字符?
    • 相关问题:如果我还是要把我的数据放入 MySQL,只要我在 MySQL 中将该列定义为日期类型的数据,像“2015 年 5 月 15 日”这样的字符串是否会被识别为日期?跨度>
    • 这是因为正确的格式,如上所示,是“%d %b %Y”,不涉及破折号
    • 好吧,在我将其更改为“%d %b %Y”后,我仍然收到相同的错误消息:“ exceptions.ValueError: time data "[u'20 May 2015']" 确实不匹配格式 '%d %b %Y' "
    【解决方案2】:

    更“简单”的方法是在 XPath 表达式中使用 built-in regular expression support 和/或 .re()

    这是同时应用的:

    In [1]: response.xpath("p[last()]/text()[re:test(., '\[\d+ \w+ \d{4}\, #\d+\]')]").re(r"\d+ \w+ \d{4}")
    Out[1]: [u'15 May 2015']
    

    或者,这是当您使用.re() 来提取定位元素的日期时,就像您之前所做的那样:

    In [2]: response.xpath("p[last()]/text()[contains(., '[')]").re(r"\d+ \w+ \d{4}")
    Out[2]: [u'15 May 2015']
    

    【讨论】:

    • 你的“scrapic”方法非常有效,alecxe!在考虑整个图片中的scrapy和mysql使用时,您是否有关于使用“[u'15 May 2015']”输出作为日期而不是字符串的建议?如果我将该列定义为“日期”类型,MySQL 会自动将“[u'15 May 2015']”识别为日期吗?
    • @LearnAWK 我建议更加明确并使用实际日期进行操作 - 它还可以更早地捕获错误,提供额外的验证。
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2021-05-12
    相关资源
    最近更新 更多