2015-06-28 86 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