Xpath提取某些字符之间的日期并用作日期

时间:2015-06-28 00:42:48

标签: python xpath web-scraping scrapy

更新:关于我的第二个问题(如何在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>

所以日期总是落后于&#34; [&#34;在&#34; &#34;之前。我使用以下xpath代码来提取:

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

但我会全线:

[15 May 2015, #9789]

那么,如何只获得&#34; 2015年5月15日&#34;?如果可以这样做,如何将刮下的字符串(2015年5月15日)转换为真正的DATE数据,那么它可以用于排序?非常感谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

更多&#34;克莱克&#34;方法将涉及在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']