网络抓取时解析日期时间字符串是最常见的挑战之一,因为网络充满了不同的日期和时间格式。
在本文中,我们将了解一个名为dateparser的 Python 包,它可以自动解析几乎任何文本格式的日期时间字符串。
什么是日期解析器?
Dateparser 是一个用于 Python 的智能日期和时间文本解析库。这是一个流行的社区包,可以datetime
从几乎任何包含日期或时间数据的文本中提取真实对象。
如何使用日期解析器?
Dateparser 的关键功能是dateparser.parse
函数。
它采用任何字符串作为参数并尝试在其中查找任何日期时间数据。例如,假设我们从网站上抓取了一堆日期字符串,然后将它们放入 dateparser:
import dateparser # Parsing dates in different formats dates_in_different_formats = [ "2023-06-07", # ISO 8601 format "06/07/2023", # US format "07/06/2023", # European format "June 7, 2023", # Long format "7 Jun 2023", # Another common format "2023-06-07T15:25:10", # ISO 8601 with time "2023-06-07 15:25:10", # Space separated date and time "2023-06-07 15:25:10.555", # Time with milliseconds ] for date_string in dates_in_different_formats: parsed_date = dateparser.parse(date_string) print(f"Original: {date_string}\n Parsed: {parsed_date}") """ Original: 2023-06-07 Parsed: 2023-06-07 00:00:00 Original: 06/07/2023 Parsed: 2023-06-07 00:00:00 Original: 07/06/2023 Parsed: 2023-07-06 00:00:00 Original: June 7, 2023 Parsed: 2023-06-07 00:00:00 Original: 7 Jun 2023 Parsed: 2023-06-07 00:00:00 Original: 2023-06-07T15:25:10 Parsed: 2023-06-07 15:25:10 Original: 2023-06-07 15:25:10 Parsed: 2023-06-07 15:25:10 Original: 2023-06-07 15:25:10.555 Parsed: 2023-06-07 15:25:10.555000 """
使用 Dateparser 我们可以解析所有这些不同的格式,而无需自己明确指定任何日期时间格式,这使得在网络抓取时的日期解析更容易访问。
常见问题
日期时间对象仍然很复杂并且高度上下文相关。因此,并非所有问题都可以在不指定解析首选项的情况下由 Dateparser 自动解决。以下是 Dateearser 遇到的主要问题以及如何使用 dateparser 设置解决这些问题。
日期对象顺序
使用 Dateparser 解析日期时间字符串的最常见问题是它无法解析日期对象顺序不明确的日期。
例如,如果我们有一个日期,07/06/2023
就不可能知道它是 6 月 7 日还是 7 月 6 日。为了解决这个问题,DATE_ORDER
可以使用设置:
import dateparser # Day first and year first dates dates = [ "13/06/2023", "06/13/2023", "23/06/13", "13/06/23", "2023/06/13", ] # Parsing with 'DMY' order print("Parsing with 'DMY' order") for date_string in dates: parsed_date = dateparser.parse(date_string, settings={'DATE_ORDER': 'DMY'}) print(f"Original: {date_string}, Parsed: {parsed_date}") # Parsing with 'YMD' order print("\nParsing with 'YMD' order") for date_string in dates: parsed_date = dateparser.parse(date_string, settings={'DATE_ORDER': 'YMD'}) print(f"Original: {date_string}, Parsed: {parsed_date}") """ Parsing with 'DMY' order Original: 13/06/2023, Parsed: 2023-06-13 00:00:00 Original: 06/13/2023, Parsed: None Original: 23/06/13, Parsed: 2013-06-23 00:00:00 Original: 13/06/23, Parsed: 2023-06-13 00:00:00 Original: 2023/06/13, Parsed: None Parsing with 'YMD' order Original: 13/06/2023, Parsed: 2023-06-13 00:00:00 Original: 06/13/2023, Parsed: 2023-06-13 00:00:00 Original: 23/06/13, Parsed: 2023-06-13 00:00:00 Original: 13/06/23, Parsed: 2013-06-23 00:00:00 Original: 2023/06/13, Parsed: 2023-06-13 00:00:00 """
日期顺序通常可以通过地理位置或被抓取网站的语言来猜测。例如,美国网站通常使用 MDY 格式,而世界其他地方则使用 DMY 或 YMD 格式。
处理隐式时区
许多被抓取的网站经常使用隐式时区。例如,如果我们抓取一个显示与纽约相关的内容的网站,则抓取的日期时间字符串很可能是纽约时间。
为此,可以使用以下TIMEZONE
设置手动指定时区:
import dateparser dateparser.parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern'}) datetime.datetime(2012, 1, 12, 22, 0) parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': '+0500'}) datetime.datetime(2012, 1, 12, 22, 0)
不完整的日期
某些日期时间字符串可能隐式不完整。例如,如果我们抓取“2024年 12 月”,我们并不知道确切的日期。为此,PREFER_DAY_OF_MONTH
可以使用设置:
import dateparser dateparser.parse('December 2023') # default behavior is today's date: datetime.datetime(2023, 12, 16, 0, 0) dateparser.parse('December 2023', settings={'PREFER_DAY_OF_MONTH': 'last'}) datetime.datetime(2023, 12, 31, 0, 0) dateparser.parse('December 2023', settings={'PREFER_DAY_OF_MONTH': 'first'}) datetime.datetime(2023, 12, 1, 0, 0)
对于隐含年份的情况,PREFER_DATES_FROM
可以使用以下设置:
import dateparser # default implies the date is from the current year dateparser.parse('March') datetime.datetime(2023, 3, 7, 0, 0) # to imply the date is from the future dateparser.parse('March', settings={'PREFER_DATES_FROM': 'future'}) datetime.datetime(2024, 3, 7, 0, 0) # to imply the date is from the past dateparser.parse('March', settings={'PREFER_DATES_FROM': 'past'}) datetime.datetime(2022, 3, 7, 0, 0)
概括
Dateparser 是一个用于解析日期时间字符串的强大库。它可以解析多种不同格式的日期,而无需自己指定任何日期时间格式。它还具有许多可用于处理隐式时区和不完整日期等常见问题的设置。
要在网络抓取中查看 Dateparser 的真实示例,请参阅我们的如何抓取 ebay教程,其中我们使用 Dateparser 来解析 Ebay 列表中使用的日期。