def _extract_members(self, page, query_string=None):
        if 'orcid-profile' not in page:
            raise ProviderContentMalformedError("Content does not contain expected text")

        data = provider._load_json(page)
        members = []
        try:
            orcid_works = data["orcid-profile"]["orcid-activities"]["orcid-works"]["orcid-work"]
        except KeyError:
            return []

        for work in orcid_works:
            new_member = None
            try:
                ids = work["work-external-identifiers"]["work-external-identifier"]

                for myid in ids:
                    if myid['work-external-identifier-type'] == "DOI":
                        doi = myid['work-external-identifier-id']['value']
                        doi = crossref.clean_doi(doi)
                        if doi:
                            new_member = ("doi", doi)
                    if myid['work-external-identifier-type'] == "PMID":
                        new_member = ("pmid", myid['work-external-identifier-id']['value'])
            except __HOLE__:
                pass

            if not new_member:
                # logger.info(u"no external identifiers, try saving whole citation for {orcid}".format(
                #     orcid=query_string))
                biblio = self._parse_orcid_work(work)
                new_member = ("biblio", biblio)

            if new_member:
                members += [new_member]    

        if not members:
            raise ProviderItemNotFoundError

        logger.info(u"returning {n} members for {orcid}".format(
            n=len(members), orcid=query_string))

        return(members)
dataset/ETHPy150Open Impactstory/total-impact-webapp/totalimpact/providers/orcid.py/Orcid._extract_members