Извлечение данных из второго появления тега в XML-файле с помощью Python

#python #xml #xml-parsing

#python #xml #синтаксический анализ xml

Вопрос:

Я анализирую XML-файл с помощью библиотеки simplified_scrapy. Мне нужно получить информацию из второго <xref-list /> . Однако каждая запись в файле содержит одну или две <xref-list /> , обе из которых ссылаются на разную информацию. Если их два <xref-list /> , я хотел бы получить информацию из второго, и если есть только один, <xref-list /> я хотел бы получить информацию только из этого. Как я могу получить информацию только из второго тега? Я попытался указать всю иерархию, но это не сработало. Мне нужно получить оба database="" и accession="" свойства для каждого объекта. Я сопоставляю код базы данных со своим словарем базы данных и добавляю присоединение к базовому URL.

 for ele in doc.selects('cell-line'):
key_values = {}
for k in ele:
    if k not in ['tag','html']:
        key_values[k]=ele[k]


    #Cross-reference
    database = ele.selects('Cellosaurus>cell-line>xref-list>xref>database()')
    accession = ele.selects('Cellosaurus>cell-line>xref-list>xref>accession()')
    cross_ref_dict = {database[i]: accession[i] for i in range(len(database))} 
    key_values['Cross-ref']=[database_dict.get(k)   cross_ref_dict.get(k) for k in 
               set(cross_ref_dict.keys()).intersection(set(database_dict.keys()))]

   database_dict = { 'CLO' : 'https://www.ebi.ac.uk/ols/ontologies/clo/terms? 
  iri=http://purl.obolibrary.org/obo/',
             'EFO' : 'https://www.ebi.ac.uk/efo/',
             'ArrayExpress' : 'https://www.ebi.ac.uk/arrayexpress/experiments/',
             'ATCC' : 'https://www.atcc.org/Products/All/', #   .aspx
             'BioSample' : 'https://www.ncbi.nlm.nih.gov/biosample/?term=',
             'CCLE' : 'https://portals.broadinstitute.org/ccle/page?cell_line=',
             'Cell_Model_Passport' : 'https://cellmodelpassports.sanger.ac.uk/passports/',
             'ChEMBL-Cells' : 'https://www.ebi.ac.uk/chembldb/cell/inspect/',
             'ChEMBL-Targets' : 'https://www.ebi.ac.uk/chembldb/target/inspect/',
             'Cosmic' : 'https://cancer.sanger.ac.uk/cosmic/sample/overview?id=',
             'Cosmic-CLP' : 'https://cancer.sanger.ac.uk/cell_lines/sample/overview?id=',
             'dbMHC' : 'https://www.ncbi.nlm.nih.gov/projects/gv/mhc/xslcgi.fcgi?cmd=subjamp;ID=',
             'ECACC' : 'https://www.phe-culturecollections.org.uk/products/celllines/generalcell/detail.jsp?refId=', #amp;collection=ecacc_g
             'DepMap' : 'https://depmap.org/portal/cell_line/',
             'GDSC' : 'https://www.cancerrxgene.org/translation/CellLine/',
             'GEO' : 'https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=',
             'IPD-IMGT/HLA' : 'https://www.ebi.ac.uk/cgi-bin/imgt/hla/fetch_cell.cgi?',
             'IARC_TP53' : 'https://p53.iarc.fr/CellLines.aspx',
             'IGRhCellID' : 'http://igrcid.ibms.sinica.edu.tw/cgi-bin/cell_line_view.cgi?cl_name=',
             'IHW' : 'https://www.fredhutch.org/en/labs/clinical/projects/ihwg.html',
             'KCLB' : 'https://cellbank.snu.ac.kr/english/sub/catalog.php?page=detailamp;CatNo=59amp;strQ=', #   amp;submit1=Find it
             'LiGeA' : 'http://hpc-bioinformatics.cineca.it/fusion/cell_line/',
             'LINCS_LDP' : 'http://lincsportal.ccs.miami.edu/cells/#/view/',
             'MMRRC' : 'https://www.mmrrc.org/catalog/getSDS.php?mmrrc_id=',
             'PharmacoDB' : 'https://pharmacodb.ca/cell_lines/',
             'PRIDE' : 'https://www.ebi.ac.uk/pride/archive/projects/',
             'RCB' : 'http://cellbank.brc.riken.jp/cell_bank/CellInfo/?cellNo=', #   amp;lang=En
             'Wikidata' : 'https://www.wikidata.org/wiki/',
             'test' : 'test'
             #'test2' : 'test2'
             }


 <Cellosaurus>
 <header>
 </header>
 <cell-line-list>
 <cell-line category="Factor-dependent cell line" created="2013-02-11" last_updated="2018-09-07" 
 entry_version="8">
  <accession-list>
    <accession type="primary">CVCL_K248</accession>
  </accession-list>
  <comment-list>
    <comment category="Transfected with">
      HGNC; 6554; LEPR
      <xref-list>
        <xref database="HGNC" category="Organism-specific databases" accession="6554">
          <property-list>
            <property name="gene/protein designation" value="LEPR"/>
          </property-list>
          <url><![CDATA[https://www.genenames.org/data/gene-symbol-report/#!/hgnc_id/HGNC:6554]]> 
          </url>
        </xref>
        </xref-list>
      </comment>
    <comment category="Characteristics"> IL3 dependent </comment>
  </comment-list>
  <species-list>
    <cv-term terminology="NCBI-Taxonomy" accession="10090">Mus musculus</cv-term>
  </species-list>>
  <reference-list>
    <reference resource-internal-ref="Patent=US7524937"/>
  </reference-list>
  <xref-list>
    <xref database="ATCC" category="Cell line collections" accession="CRL-12015">
      <property-list>
        <property name="Discontinued" value="true"/>
      </property-list>
    </xref>
    <xref database="Wikidata" category="Other" accession="Q54752994">
      <url><![CDATA[https://www.wikidata.org/wiki/Q54752994]]></url>
    </xref>
  </xref-list>
</cell-line>
</cell-line-list>
<Cellosaurus>
  

Ответ №1:

Насколько я знаю, simplified_scrapy не поддерживает xpath, но поддерживает lxml. Итак, если вы передадите xml в своем вопросе (исправлено, для окончательного <Cellosaurus> варианта требуется закрывающий тег) в lxml, вы можете достаточно легко извлечь эту информацию.

 from lxml import etree
atcc = """[your xml, corrected]"""
doc = etree.XML(atcc)

for atr in doc.xpath('(//xref-list)[2]/xref[1]'):
        print(atr.attrib['database'])
        print(atr.attrib['accession'])
  

Вывод:

 ATCC
CRL-12015
  

Комментарии:

1. Спасибо. Но это возвращает только первый элемент из второго xref-list . Wikidata и Q54752994 по-прежнему отсутствуют. Как получить несколько значений?

2. В вашем вопросе говорилось: «Мне нужно получить как database =»ATCC», так и accession =»CRL-12015″. То, что вы задаете сейчас, — это другой вопрос; может быть, вам действительно нужно это как таковое, и я буду рад взглянуть.

3. Да, извините, я не объяснил это должным образом. Я обновил описание проблемы. Я надеюсь, что это имеет больше смысла. Спасибо