Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Xpath提取特定字符之间的日期并用作日期_Python_Xpath_Web Scraping_Scrapy - Fatal编程技术网

Python Xpath提取特定字符之间的日期并用作日期

Python Xpath提取特定字符之间的日期并用作日期,python,xpath,web-scraping,scrapy,Python,Xpath,Web Scraping,Scrapy,更新:关于我的第二个问题(如何在MySQL中将字符串转换为日期格式),我找到了一种方法,希望与大家分享: 1) 将“字符串日期”数据保存为VARCHAR(不使用文本) 2) 当以PHP或其他方式显示MySQL数据时,请使用str_to_date(字符串日期列,日期格式)的功能,如以下示例: $sql = "SELECT * FROM yourtablename ORDER BY str_to_date(string-date-column, '%d %M %Y')"; 我正在使用scrapy

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

1) 将“字符串日期”数据保存为VARCHAR(不使用文本)

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>
但我会得到整条线:

[15 May 2015, #9789]

那么,如何只获得“2015年5月15日”的部分?如果可以,如何将刮取的字符串(2015年5月15日)转换为实际日期数据,以便用于排序?非常感谢

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

substring-before(substring-after(p[last()]/text()[contains(., '[')], '['), ',')
关于第二个问题,您可以使用将字符串转换为
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'>
2015-05-15 00:00:00
一种更“粗略”的方法是在XPath表达式和/或
.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']

问题的第二部分是。在尝试使用datetime函数时,我收到以下错误消息:“exceptions.ValueError:time data”[u'2015年5月15日]]与格式“%d-%b-%Y”不匹配。是因为Scrapy在“2015年5月15日”的刮取字符串前后添加了特殊字符吗?相关问题:如果我还是要将数据放入MySQL,那么像“2015年5月15日”这样的字符串是否会被识别为日期,只要我在MySQL中将该列定义为数据的日期类型?这是因为如上所示,正确的格式是“%d%b%Y”在没有破折号的情况下,在我将其更改为“%d%b%Y”后,仍然会收到相同的错误消息:“exceptions.ValueError:time data”[u'20 May 2015']”与格式“%d%b%Y”不匹配。“您的“scrapic”方法非常有效,alecxe!您是否有建议将“[u'2015年5月15日']”输出用作日期而不是字符串,同时考虑整体使用scrapy和mysql?如果我将该列定义为“日期”类型,MySQL会自动将“[u'2015年5月15日]]”识别为日期吗?@LearnAWK我建议更加明确,并使用实际日期操作-它还会捕获前面的错误,提供额外的验证。
In [2]: response.xpath("p[last()]/text()[contains(., '[')]").re(r"\d+ \w+ \d{4}")
Out[2]: [u'15 May 2015']