2017-10-08 38 views
0

私はPythonを使ってYAMLファイルを解析しています。python、yamlアポストロフィを含む文字列を解析する方法

YAML文書の一つは、次のように辞書が含まれています。最後にアポストロフィが空白が先行しているため

scrapers: 
    results: //article[@class='story '] 

この明らかな問題が発生します。空白を取り除くことができれば問題は解決します。しかし、それはxpathなので、私はできません。

どのように私はそのシーケンスをエスケープできるか知っていますか? は、私は他のSO質問に見えたが、

scrapers: 
    results: //article[@class='story '] 

または

scrapers:> 
    results: //article[@class='story '] 

または

scrapers: 
    results: //article[@class='story ''] 

を使用して "" 内の文字列、または を包むようなソリューションが動作しませんでした。

EDIT: ScannerError::私はエラーが表示さしかし

import yaml 
with open('/home/depot/wintergreen/yaml/scrapers.yml', 'r') as f: 
    scrapers = yaml.load(f) 

:マッピング値は空白を指し、ここで

許可されていない私は上記の式を含むファイルを開くしようとしています story以降。 以下の回答者から提供された提案、つまりpython dictからyaml式を作成しようとしています。これは機能します。私はyamlをファイルに保存し、再びロードします。それはまた動作します。 私はまったく同じ文字を入力して、YAMLを作成するときしかし、それは動作しません...

はEDIT2: 私は、問題は、私は窓マシン上のYAMLファイルを作成し、それをアップロードしているという事実から生じ考えますUNIXサーバー上で実行します。

+0

これに問題があるコードはどこにありますか?どのライブラリを使用していますか?あるいは正規表現でYAMLを解析しようとしていますか? (あなたはしないでください) – Anthon

答えて

1

それは構造のための正しいYAMLフォーマットを見つけるのは簡単です:Pythonで構造体を作成後、YAMLでエンコードされた文字列を作成するためにyaml.dumpを使用します。

d = {'scrapers': {'results': "//article[@class='story ']"}} 
print d 

import yaml 
print yaml.dump(d, default_flow_style=False) 

あり、その結果:

{'scrapers': {'results': "//article[@class='story '"}} 

scrapers: 
    results: //article[@class='story '] 

これは正しいYAML表現です。問題がある場合は、入力テキストではなくパーサにあります。標準yamlライブラリを使用している場合は、それを正しく解析する必要があります。

+0

Pythonの任意のバージョンの標準Pythonライブラリにはyamlパーサーはありません。 – Anthon

+0

@クリスジョンソンはい、あなたはそれが正しいように動作します。私の問題は、私はyaml(imをlinux debianに移植し、vimを使って)を書こうとしていて、 'import yaml をopen( '/ home/depot/wintergreen/yaml/scrapers.yml '、' r ')をf: scrapers = yaml.load(f) 'に設定します。 'story'の後の空白を指すエラーが表示されます:ScannerError:マッピング値はここでは許可されません。あなたのメソッドで生成されたyaml式をvimに貼り付けようとしましたが、それでも同じエラーがスローされます。多分それはエンコーディングの問題ですか? –

+0

@Anthonあなたは図書館と標準図書館を区別していますか? 'pip install pyyaml'に続いて' import yaml'がうまくいきます。これは非常に一般的な選択です。 –

関連する問題