diff --git a/sru/almasru.py b/sru/almasru.py index eb2c0f90a7b9617096ae37a93c9734a19b295944..2bf896d25a3f42b15e30875582c7538c9abc54dd 100644 --- a/sru/almasru.py +++ b/sru/almasru.py @@ -82,19 +82,52 @@ class RecordRetriever: :raises SruDiagnostics: if SRU returns an error """ - startrecord = '0' - + startrecord = 0 sru_url = self._create_url(alma_query, startrecord) sru_xml = self._response_to_xml(sru_url) - self._raise_errors_unique_record(sru_xml) + num_recs = sru_xml.find("srw:numberOfRecords", self.namespaces) + self._raise_error_unique(num_recs) + self._raise_error_no_match(num_recs) + self._raise_error_sru(sru_xml) xml_list = self._extract_marc_xml(sru_xml) return xml_list[0] - def _create_url(self, alma_query: str, startrecord: str) -> str: + def get_multiple(self, alma_query: str) -> list: + """Return one MARC XML record for a specific query. + + :param alma_query: URI-parameter query for SRU request + :return: XML as list of etree-Elements + :rtype list + :raises NoRecord: if no record was returned by SRU + :raises SruDiagnostics: if SRU returns an error + """ + + startrecord = 0 + sru_url = self._create_url(alma_query, startrecord) + sru_xml = self._response_to_xml(sru_url) + + num_recs = sru_xml.find("srw:numberOfRecords", self.namespaces) + self._raise_error_no_match(num_recs) + self._raise_error_sru(sru_xml) + + num_pages = num_recs//10 - self.url_query['startRecord'] = startrecord + xml_list = self._extract_marc_xml(sru_xml) + + for i in range(num_pages): + + startrecord = i*10 + sru_url = self._create_url(alma_query, startrecord) + sru_xml = self._response_to_xml(sru_url) + xml_list.append(self._extract_marc_xml(sru_xml)) + + return xml_list + + def _create_url(self, alma_query: str, startrecord: int) -> str: + + self.url_query['startRecord'] = str(startrecord) self.url_query['maximumRecords'] = '1' self.url_query['query'] = alma_query url_query_string = parse.urlencode(self.url_query) @@ -102,27 +135,30 @@ class RecordRetriever: return sru_url - def _response_to_xml(self, sru_url): + @staticmethod + def _response_to_xml(url): - response = request.urlopen(sru_url).read() - sru_xml = fromstring(response) + response = request.urlopen(url).read() + xml = fromstring(response) - return sru_xml + return xml - def _raise_errors_unique_record(self, sru_xml: Element): + @staticmethod + def _raise_error_unique(num_recs: Element): - num_recs = sru_xml.find("srw:numberOfRecords", self.namespaces) + if (num_recs is not None and + num_recs.text > '1'): + raise MultiRecord('More than one record found' + 'while exactly one was expected!') + + @staticmethod + def _raise_error_no_match(num_recs: Element): if (num_recs is not None and num_recs.text == '0'): raise NoRecord('No matching records found!') - elif (num_recs is not None and - num_recs.text > '1'): - raise MultiRecord('More than one record found' - 'while exactly one was expected!') - - def _raise_errors_sru(self, sru_xml: Element): + def _raise_error_sru(self, sru_xml: Element): if sru_xml.find("srw:diagnostics", self.namespaces): xpath = "srw:diagnostics/diag:diagnostic/diag:message"