2017-11-22 8 views
0

私は今この問題を解決していますが、解決策はありません。PythonでBeautifulSoupを使用して異なるデータを持つ繰り返しタグを使用してXMLファイルを解析する

pub_ref = soup.findAll("publication-reference") 

with open('./output.csv', 'ab+') as f: 
    writer = csv.writer(f, dialect = 'excel') 

    for info in pub_ref: 
     pat_cite = soup.findAll("patcit") 
     for item in pat_cite: 
      if item.find("name"): 
       name = item.find("name").text 

      writer.writerow([name]) 

私は引用子ルート「pacit」の子どもたちを解析するスクリプトのこの部分「出版・リファレンス」の:私はそうのように見える私のPythonスクリプトのスニペットを持っていますそれは、XMLファイル内で複数回アップ作物や次のようになります。

. 
. 
. 
    <us-references-cited> 
    <us-citation> 
    <patcit num="00001"> 
    <document-id> 
    <country>US</country> 
    <doc-number>1589850</doc-number> 
    <kind>A</kind> 
    <name>Haskell</name> 
    <date>19260600</date> 
    </document-id> 
    </patcit> 
    <category>cited by applicant</category> 
    </us-citation> 
    <us-citation> 
    <patcit num="00002"> 
    <document-id> 
    <country>US</country> 
    <doc-number>D134414</doc-number> 
    <kind>S</kind> 
    <name>Orme, Jr.</name> 
    <date>19421100</date> 
    </document-id> 
    </patcit> 
    <category>cited by applicant</category> 
    </us-citation> 
    <us-citation> 
. 
. 
. 

ドットがファイルがこれよりも大きく、親ルート「出版の参照を」表示されていないことを示しています。問題は、私のスクリプトは、多くの子どものうちの一つである、"名前"のルートだけを解析することです。そして、これは発明ごとに1つだけのエントリがあるが、倍数ではない根にはうまく機能します。

あなたは出力がそうのようなコラムダウンこれらの複数のpatcitの引用を示しせる作家、と見ることができるように、私はまた、CSVファイルでこれらを格納したい:

invention name country city  .... patcit name1 patcit date1.... 
        white space   patcit name2 patcit date2.... 
        white space   patcit name2 patcit date3.... 

私はXMLファイルをここで見つけることができますhttps://bulkdata.uspto.gov/data/patent/grant/redbook/fulltext/2017/

私は複数の方法を試してきたと私はこれが初心者の問題だと思う任意の助けていただければ幸いです。

答えて

1

まず、zipファイル "ipg170103.zip"の1つをダウンロードし、複数のxmlドキュメントが含まれていることがわかりました。だから私は走った(Linux上で)

csplit ipg170103.xml '/xml version/' '{*}' 

ファイルを複数の単一文書に分割する。これらのファイル "xx995"のいずれかを使用して作業しています。 "国"のファイルに "grep"を使用したので、あなたは "出版 - 参照"(あなたがスクリプトを変更する必要がない場合)と同様に "発明"の下に "国"を望んでいたので、 "発明タイトル"。私も、「patcit」の下に「date」という複数のインスタンスがあることを発見しました。私はあなたが望むものを知るにはあまりにも多くの「都市」要素を見つけました。 しかし、いずれにしても、あなたが望むものを正確に判断することができなかったので、あなたの正確なニーズに対してちょっと調整する必要があるかもしれません。

from bs4 import BeautifulSoup 
import csv 

xml = open("xx995",'r').read() 
soup = BeautifulSoup(xml, 'lxml') 
pat = soup.find("us-patent-grant") 

country = pat.find("publication-reference").find("country").text 
invention = pat.find("invention-title").text 

data = [] 
pat_cite = pat.findAll("patcit") 
for item in pat_cite: 
    name = None 
    date = None 
    if item.find("name"): 
     name = item.find("name").text 
     # Only get date if name 
     if item.find("date"): 
      date = item.find("date").text 
     data.append((name,date)) 

with open('./output.csv', 'wt') as f: 
    writer = csv.writer(f, dialect='excel') 
    writer.writerow(('invention', 'country', 'patcit name', 'patcit date')) 
    for d in data: 
     writer.writerow((invention, country, d[0], d[1])) 
     invention = None 
     country = None 

出力:

enter image description here

+0

非常に役に立ちました。私のWindowsセットアップで実際のCSVがあなたのスクリプトを書いていない理由を理解できません。ファイル名をxmlのパスに置き換えても、何も得られません。 さらに、私が望むのは、これらのXMLで_ALL_タグを取得することだけです。それは大きな仕事です。私が微調整しなければならない反復の子どもたちがさらに増えています。しかし、アウトラインは一般的なルールとして役立っています。 – HelloToEarth

+0

私はそれを理解しました、@ Dan-Dev。私は単にxmlからxml_stringへのスープ呼び出しを適切に読み取るために置き換えました。私はBSのテキストの解釈にいくつかの問題があったと思う。 – HelloToEarth

+0

あなたはそれを理解してうれしいです。 xmlドキュメントをcsvドキュメントに変換したい場合は、XSLTを使用することを考えましたか? XSLTはちょうどこれのために設計されており、学ぶのは良いスキルであり、長期的にあなたの時間を節約することができます。 –

関連する問題