2015-06-28 53 views
1

UPDATE:关于我的第二个问题(如何将字符串转换为日期格式在MySQL),我找到了一种方法,并希望分享它:Xpath的提取日期

1)保存该“字符串日期”的数据作为VARCHAR(不要使用TEXT)

2)当表示PHP或其他方式的MySQL数据,使用STR_TO_DATE(字符串日期栏,日期格式的功能),如以下示例:

$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] 

那么,如何让“2015年5月15日”的只有一部分?如果可以这样做,如何将抓取的字符串(2015年5月15日)转换为真正的DATE数据,因此可用于排序?谢谢一堆!

回答

1

更 “scrapic” 方法将涉及使用在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'] 
+0

您的”scrapic“方法非常完美,alecxe!你有没有关于使用“[u'15 May 2015']”输出作为日期而不是字符串的建议,同时在整个图片中考虑scrapy和mysql的使用情况?如果我将该列定义为“日期”类型,MySQL是否会自动将“[u'15 May 2015']”识别为日期? – LearnAWK

+0

@LearnAWK我建议您更加明确并且使用实际日期进行操作 - 它也会在早期发现错误并提供额外的验证。 – alecxe

2

关于第一个问题,假设有最大的一个日期的时间,你可以使用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'> 
+1

问题的第二部分是[在此回答](http://stackoverflow.com/q/1713594/190597)。 – unutbu

+0

尝试使用日期时间函数时,我收到以下错误消息:“exceptions.ValueError:time data”[u'15 2015年5月']“与格式'%d-%b-%Y'不匹配”。是否因为Scrapy在“2015年5月15日”的字符串之前和之后添加了特殊字符? – LearnAWK

+0

相关问题:如果我将数据放入MySQL,只要将该列定义为MySQL中数据的日期类型,是否会将“2015年5月15日”这样的字符串识别为日期? – LearnAWK