def download_sample_cases( self, *, session: Optional[requests.Session] = None ) -> List[onlinejudge.type.TestCase]: session = session or utils.get_default_session() resp = utils.request('GET', self.get_url(), session=session) soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) samples = onlinejudge._implementation.testcase_zipper.SampleZipper() for table in soup.find_all('table', class_="samples"): log.debug('table: %s', str(table)) case = table.find('tbody').find('tr') assert len(list(case.children)) == 2 input_pre, output_pre = list( map(lambda td: td.find('pre'), list(case.children))) assert input_pre.name == 'pre' assert output_pre.name == 'pre' assert re.search("^preSample.*Input$", input_pre.attrs['id']) assert re.search("^preSample.*Output$", output_pre.attrs['id']) samples.add( utils.parse_content(input_pre).lstrip().encode(), "Input") samples.add( utils.parse_content(output_pre).lstrip().encode(), "Output") return samples.get()
def download_sample_cases( self, *, session: Optional[requests.Session] = None ) -> List[onlinejudge.type.TestCase]: session = session or utils.get_default_session() # get resp = utils.request('GET', self.get_url(), session=session) # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) samples = onlinejudge._implementation.testcase_zipper.SampleZipper() for tag in soup.find_all('div', class_=re.compile( '^(in|out)put$')): # Codeforces writes very nice HTML :) log.debug('tag: %s', str(tag)) non_empty_children = [ child for child in tag.children if child.name or child.strip() ] log.debug("tags after removing empty strings: %s", non_empty_children) assert len(non_empty_children ) == 2 # if not 2, next line throws ValueError. title, pre = list(non_empty_children) assert 'title' in title.attrs['class'] assert pre.name == 'pre' data = utils.format_sample_case(str(utils.parse_content(pre))) samples.add(data.encode(), title.string) return samples.get()
def _parse_sample_tag(self, tag: bs4.Tag) -> Optional[Tuple[str, str]]: assert isinstance(tag, bs4.Tag) assert tag.name == 'pre' prv = utils.previous_sibling_tag(tag) pprv = tag.parent and utils.previous_sibling_tag(tag.parent) if prv.name == 'h6' and tag.parent.name == 'div' and tag.parent['class'] == ['paragraph'] and pprv.name == 'h5': logger.debug('h6: %s', str(prv)) logger.debug('name.encode(): %s', prv.string.encode()) s = utils.parse_content(tag) return utils.textfile(s.lstrip()), pprv.string + ' ' + prv.string return None
def download_sample_cases( self, *, session: Optional[requests.Session] = None) -> List[TestCase]: session = session or utils.get_default_session() # get samples via the official API # reference: http://developers.u-aizu.ac.jp/api?key=judgedat%2Ftestcases%2Fsamples%2F%7BproblemId%7D_GET url = 'https://judgedat.u-aizu.ac.jp/testcases/samples/{}'.format( self.problem_id) resp = utils.request('GET', url, session=session) samples = [] # type: List[TestCase] for i, sample in enumerate( json.loads(resp.content.decode(resp.encoding))): samples += [ TestCase( 'sample-{}'.format(i + 1), str(sample['serial']), sample['in'].encode(), str(sample['serial']), sample['out'].encode(), ) ] # parse HTML if no samples are registered # see: https://github.com/kmyk/online-judge-tools/issues/207 if not samples: logger.warning( "sample cases are not registered in the official API") logger.info("fallback: parsing HTML") # reference: http://developers.u-aizu.ac.jp/api?key=judgeapi%2Fresources%2Fdescriptions%2F%7Blang%7D%2F%7Bproblem_id%7D_GET url = 'https://judgeapi.u-aizu.ac.jp/resources/descriptions/ja/{}'.format( self.problem_id) resp = utils.request('GET', url, session=session) html = json.loads(resp.content.decode(resp.encoding))['html'] # list h3+pre zipper = onlinejudge._implementation.testcase_zipper.SampleZipper() expected_strings = ('入力例', '出力例', 'Sample Input', 'Sample Output') soup = bs4.BeautifulSoup(html, utils.HTML_PARSER) for pre in soup.find_all('pre'): tag = pre.find_previous_sibling() if tag and tag.name == 'h3' and tag.string and any( s in tag.string for s in expected_strings): s = utils.textfile(utils.parse_content(pre).lstrip()) zipper.add(s.encode(), tag.string) samples = zipper.get() return samples
def download_sample_cases( self, *, session: Optional[requests.Session] = None) -> List[TestCase]: """ :raises SampleParseError: """ session = session or utils.get_default_session() url = 'https://www.spoj.com/problems/{}'.format(self.problem_id) resp = utils.request('GET', url, session=session) soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) samples = onlinejudge._implementation.testcase_zipper.SampleZipper() for pre, h3 in self._find_sample_tags(soup): s = utils.textfile( utils.dos2unix(utils.parse_content(pre).lstrip())) name = h3.string samples.add(s.encode(), name) return samples.get()