Prepare test data
This commit is contained in:
parent
748decd373
commit
4bcf0aed87
295
description_parsing_cases.json
Normal file
295
description_parsing_cases.json
Normal file
|
|
@ -0,0 +1,295 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "2018年12月30日至2019年1月1日放假调休,共3天。2018年12月29日(星期六)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2018-12-30", "isOffDay": true },
|
||||||
|
{ "date": "2018-12-31", "isOffDay": true },
|
||||||
|
{ "date": "2019-01-01", "isOffDay": true },
|
||||||
|
{ "date": "2019-12-29", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "2月4日至10日放假调休,共7天。2月2日(星期六)、2月3日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2019-02-04", "isOffDay": true },
|
||||||
|
{ "date": "2019-02-05", "isOffDay": true },
|
||||||
|
{ "date": "2019-02-06", "isOffDay": true },
|
||||||
|
{ "date": "2019-02-07", "isOffDay": true },
|
||||||
|
{ "date": "2019-02-08", "isOffDay": true },
|
||||||
|
{ "date": "2019-02-09", "isOffDay": true },
|
||||||
|
{ "date": "2019-02-02", "isOffDay": false },
|
||||||
|
{ "date": "2019-02-03", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "4月5日放假,与周末连休。",
|
||||||
|
"expected": [{ "date": "2019-04-05", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "5月1日放假。",
|
||||||
|
"expected": [{ "date": "2019-05-01", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "6月7日放假,与周末连休。",
|
||||||
|
"expected": [{ "date": "2019-06-07", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "9月13日放假,与周末连休。",
|
||||||
|
"expected": [{ "date": "2019-09-13", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2019,
|
||||||
|
"description": "10月1日至7日放假调休,共7天。9月29日(星期日)、10月12日(星期六)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2019-10-01", "isOffDay": true },
|
||||||
|
{ "date": "2019-10-02", "isOffDay": true },
|
||||||
|
{ "date": "2019-10-03", "isOffDay": true },
|
||||||
|
{ "date": "2019-10-04", "isOffDay": true },
|
||||||
|
{ "date": "2019-10-05", "isOffDay": true },
|
||||||
|
{ "date": "2019-10-06", "isOffDay": true },
|
||||||
|
{ "date": "2019-10-07", "isOffDay": true },
|
||||||
|
{ "date": "2019-09-29", "isOffDay": false },
|
||||||
|
{ "date": "2019-10-12", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "1月1日放假,与周末连休。",
|
||||||
|
"expected": [{ "date": "2018-01-01", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "2月15日至21日放假调休,共7天。2月11日(星期日)、2月24日(星期六)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2018-02-15", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-16", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-17", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-18", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-19", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-20", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-21", "isOffDay": true },
|
||||||
|
{ "date": "2018-02-11", "isOffDay": false },
|
||||||
|
{ "date": "2018-02-24", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "4月5日至7日放假调休,共3天。4月8日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2018-04-05", "isOffDay": true },
|
||||||
|
{ "date": "2018-04-06", "isOffDay": true },
|
||||||
|
{ "date": "2018-04-07", "isOffDay": true },
|
||||||
|
{ "date": "2018-04-08", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "4月29日至5月1日放假调休,共3天。4月28日(星期六)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2018-04-29", "isOffDay": true },
|
||||||
|
{ "date": "2018-04-30", "isOffDay": true },
|
||||||
|
{ "date": "2018-05-01", "isOffDay": true },
|
||||||
|
{ "date": "2018-04-28", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "6月18日放假,与周末连休。",
|
||||||
|
"expected": [{ "date": "2018-06-18", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "9月24日放假,与周末连休。",
|
||||||
|
"expected": [{ "date": "2018-09-24", "isOffDay": true }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2018,
|
||||||
|
"description": "10月1日至7日放假调休,共7天。9月29日(星期六)、9月30日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2018-10-01", "isOffDay": true },
|
||||||
|
{ "date": "2018-10-02", "isOffDay": true },
|
||||||
|
{ "date": "2018-10-03", "isOffDay": true },
|
||||||
|
{ "date": "2018-10-04", "isOffDay": true },
|
||||||
|
{ "date": "2018-10-05", "isOffDay": true },
|
||||||
|
{ "date": "2018-10-06", "isOffDay": true },
|
||||||
|
{ "date": "2018-10-07", "isOffDay": true },
|
||||||
|
{ "date": "2018-09-29", "isOffDay": false },
|
||||||
|
{ "date": "2018-09-30", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "1月1日至3日放假调休,共3天。1月5日(星期六)、1月6日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-01-01", "isOffDay": true },
|
||||||
|
{ "date": "2013-01-02", "isOffDay": true },
|
||||||
|
{ "date": "2013-01-03", "isOffDay": true },
|
||||||
|
{ "date": "2013-01-05", "isOffDay": false },
|
||||||
|
{ "date": "2013-01-06", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "2月9日至15日放假调休,共7天。2月16日(星期六)、2月17日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-02-09", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-10", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-11", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-12", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-13", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-14", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-15", "isOffDay": true },
|
||||||
|
{ "date": "2013-02-16", "isOffDay": false },
|
||||||
|
{ "date": "2013-02-17", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "4月4日至6日放假调休,共3天。4月7日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-04-04", "isOffDay": true },
|
||||||
|
{ "date": "2013-04-05", "isOffDay": true },
|
||||||
|
{ "date": "2013-04-06", "isOffDay": true },
|
||||||
|
{ "date": "2013-04-07", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "4月29日至5月1日放假调休,共3天。4月27日(星期六)、4月28日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-04-29", "isOffDay": true },
|
||||||
|
{ "date": "2013-04-30", "isOffDay": true },
|
||||||
|
{ "date": "2013-05-01", "isOffDay": true },
|
||||||
|
{ "date": "2013-04-27", "isOffDay": false },
|
||||||
|
{ "date": "2013-04-28", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "6月10日至12日放假调休,共3天。6月8日(星期六)、6月9日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-06-10", "isOffDay": true },
|
||||||
|
{ "date": "2013-06-11", "isOffDay": true },
|
||||||
|
{ "date": "2013-06-12", "isOffDay": true },
|
||||||
|
{ "date": "2013-06-08", "isOffDay": false },
|
||||||
|
{ "date": "2013-06-09", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "9月19日至21日放假调休,共3天。9月22日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-09-19", "isOffDay": true },
|
||||||
|
{ "date": "2013-09-20", "isOffDay": true },
|
||||||
|
{ "date": "2013-09-21", "isOffDay": true },
|
||||||
|
{ "date": "2013-09-22", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2013,
|
||||||
|
"description": "10月1日至7日放假调休,共7天。9月29日(星期日)、10月12日(星期六)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2013-10-01", "isOffDay": true },
|
||||||
|
{ "date": "2013-10-02", "isOffDay": true },
|
||||||
|
{ "date": "2013-10-03", "isOffDay": true },
|
||||||
|
{ "date": "2013-10-04", "isOffDay": true },
|
||||||
|
{ "date": "2013-10-05", "isOffDay": true },
|
||||||
|
{ "date": "2013-10-06", "isOffDay": true },
|
||||||
|
{ "date": "2013-10-07", "isOffDay": true },
|
||||||
|
{ "date": "2013-09-29", "isOffDay": false },
|
||||||
|
{ "date": "2013-10-12", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "2007年12月30日—2008年1月1日放假,共3天。其中,1月1日(星期二)为法定节假日,12月30日(星期日)为公休日,12月29日(星期六)公休日调至12月31日(星期一),12月29日(星期六)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2007-12-30", "isOffDay": true },
|
||||||
|
{ "date": "2007-12-31", "isOffDay": true },
|
||||||
|
{ "date": "2008-01-01", "isOffDay": true },
|
||||||
|
{ "date": "2019-12-29", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "2月6日—12日(农历除夕至正月初六)放假,共7天。其中,2月6日(除夕)、2月7日(春节)、2月8日(正月初二)为法定节假日,2月9日(星期六)、2月10日(星期日)照常公休,2月2日(星期六)、2月3日(星期日)两个公休日调至2月11日(星期一)、2月12日(星期二),2月2日(星期六)、2月3日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-02-06", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-07", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-08", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-09", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-10", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-11", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-12", "isOffDay": true },
|
||||||
|
{ "date": "2008-02-02", "isOffDay": false },
|
||||||
|
{ "date": "2008-02-03", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "4月4日—6日放假,共3天。其中,4月4日(清明节)为法定节假日,4月5日(星期六)、4月6日(星期日)照常公休。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-04-04", "isOffDay": true },
|
||||||
|
{ "date": "2008-04-05", "isOffDay": true },
|
||||||
|
{ "date": "2008-04-06", "isOffDay": true }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "5月1日—3日放假,共3天。其中,5月1日为法定节假日,5月3日(星期六)为公休日,5月4日(星期日)公休日调至5月2日(星期五),5月4日(星期日)上班。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-05-01", "isOffDay": true },
|
||||||
|
{ "date": "2008-05-02", "isOffDay": true },
|
||||||
|
{ "date": "2008-05-03", "isOffDay": true },
|
||||||
|
{ "date": "2008-05-04", "isOffDay": false }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "6月7日—9日放假,共3天。其中,6月7日(星期六)照常公休,6月8日(农历五月初五,端午节)为法定节假日,6月8日(星期日)公休日调至6月9日(星期一)。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-06-07", "isOffDay": true },
|
||||||
|
{ "date": "2008-06-08", "isOffDay": true },
|
||||||
|
{ "date": "2008-06-09", "isOffDay": true }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "9月13日—15日放假,共3天。其中,9月13日(星期六)为公休日,9月14日(农历八月十五,中秋节)为法定节假日,9月14日(星期日)公休日调至9月15日(星期一)。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-09-13", "isOffDay": true },
|
||||||
|
{ "date": "2008-09-14", "isOffDay": true },
|
||||||
|
{ "date": "2008-09-15", "isOffDay": true }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "9月13日—15日放假,共3天。其中,9月13日(星期六)为公休日,9月14日(农历八月十五,中秋节)为法定节假日,9月14日(星期日)公休日调至9月15日(星期一)。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-09-13", "isOffDay": true },
|
||||||
|
{ "date": "2008-09-14", "isOffDay": true },
|
||||||
|
{ "date": "2008-09-15", "isOffDay": true }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"year": 2008,
|
||||||
|
"description": "9月29日—10月5日放假,共7天。其中,10月1日、2日、3日为法定节假日,9月27日(星期六)、9月28日(星期日)两个公休日调至9月29日(星期一)、30日(星期二),10月4日(星期六)、5日(星期日)照常公休。",
|
||||||
|
"expected": [
|
||||||
|
{ "date": "2008-09-29", "isOffDay": true },
|
||||||
|
{ "date": "2008-09-30", "isOffDay": true },
|
||||||
|
{ "date": "2008-10-01", "isOffDay": true },
|
||||||
|
{ "date": "2008-10-02", "isOffDay": true },
|
||||||
|
{ "date": "2008-10-03", "isOffDay": true },
|
||||||
|
{ "date": "2008-10-04", "isOffDay": true },
|
||||||
|
{ "date": "2008-10-05", "isOffDay": true },
|
||||||
|
{ "date": "2008-09-27", "isOffDay": false },
|
||||||
|
{ "date": "2008-09-28", "isOffDay": false }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
69
fetch_holidays.py
Normal file
69
fetch_holidays.py
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Fetch holidays from gov.cn """
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import re
|
||||||
|
|
||||||
|
import bs4
|
||||||
|
import requests
|
||||||
|
|
||||||
|
SEARCH_URL = ('http://sousuo.gov.cn/s.htm'
|
||||||
|
'?t=paper&advance=true&sort=&title={year}+%E8%8A%82%E5%81%87%E6%97%A5'
|
||||||
|
'&puborg=%E5%9B%BD%E5%8A%A1%E9%99%A2%E5%8A%9E%E5%85%AC%E5%8E%85'
|
||||||
|
'&pcodeJiguan=%E5%9B%BD%E5%8A%9E%E5%8F%91%E6%98%8E%E7%94%B5')
|
||||||
|
|
||||||
|
|
||||||
|
def get_paper_urls(year):
|
||||||
|
url = SEARCH_URL.format(year=year)
|
||||||
|
body = requests.get(url).text
|
||||||
|
ret = re.findall(
|
||||||
|
r'<li class="res-list".*?<a href="(.+?)".*?</li>', body, flags=re.S)
|
||||||
|
assert all(
|
||||||
|
re.match(
|
||||||
|
r'http://www.gov.cn/zhengce/content/\d{4}-\d{2}/\d{2}/content_\d+.htm', i)
|
||||||
|
for i in ret), 'Site changed, need human verify'
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def get_paper(url):
|
||||||
|
response = requests.get(url)
|
||||||
|
response.encoding = 'utf-8'
|
||||||
|
soup = bs4.BeautifulSoup(response.text, features='html.parser')
|
||||||
|
container = soup.find('td', class_='b12c')
|
||||||
|
assert container, f'Can not get paper container from url: {url}'
|
||||||
|
ret = container.get_text()
|
||||||
|
assert ret, f'Can not get paper context from url: {url}'
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def get_rules(paper: str):
|
||||||
|
lines: list = paper.splitlines()
|
||||||
|
for i in sorted(set(lines), key=lines.index):
|
||||||
|
match = re.match(r'[一二三四五六七八九十]、(.+?):(.+)', i)
|
||||||
|
if match:
|
||||||
|
yield match.groups()
|
||||||
|
|
||||||
|
|
||||||
|
def parse_holiday_description(year, description):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def parse_paper(url):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('year')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
papers = get_paper_urls(args.year)
|
||||||
|
|
||||||
|
for i in papers:
|
||||||
|
paper = get_paper(i)
|
||||||
|
[print(i) for i in get_rules(paper)]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
2
requirements.txt
Normal file
2
requirements.txt
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
requests ~= 2.21.0
|
||||||
|
beautifulsoup4 ~= 4.7.1
|
||||||
24
test_fetch_holidays.py
Normal file
24
test_fetch_holidays.py
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from fetch_holidays import parse_holiday_description
|
||||||
|
|
||||||
|
|
||||||
|
def _generate_tests():
|
||||||
|
with open('description_parsing_cases.json', 'r', encoding='utf-8', ) as f:
|
||||||
|
cases = json.load(f)
|
||||||
|
|
||||||
|
def create_test(case):
|
||||||
|
def _test():
|
||||||
|
year, description, expected = case['year'], case['description'], case['expected']
|
||||||
|
assert parse_holiday_description(
|
||||||
|
year, description) == expected, case
|
||||||
|
return _test
|
||||||
|
|
||||||
|
for index, case in enumerate(cases, 1):
|
||||||
|
setattr(sys.modules[__name__],
|
||||||
|
f'test_parse_holiday_description_{index}', create_test(case))
|
||||||
|
|
||||||
|
|
||||||
|
_generate_tests()
|
||||||
Loading…
Reference in New Issue
Block a user