2017-10-08 3 views
0

J'utilise python pour analyser des fichiers YAML.python, yaml comment analyser une chaîne contenant une apostrophe

L'un des documents YAML contiennent un dictionnaire, comme suit:

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

Cela provoque apparemment un problème parce que le dernier est précédé d'une apostrophe un espace. Si je pouvais supprimer les espaces, cela résoudrait le problème. Cependant, puisque c'est un xpath je ne peux pas. Est-ce que quelqu'un sait comment je pourrais échapper à cette séquence?

Je regardais dans d'autres SO question, mais comme solution envelopper la chaîne dans "", ou en utilisant

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

ou

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

ou

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

ne fonctionne pas.

EDIT: Je suis en train d'ouvrir un fichier contenant l'expression ci-dessus:

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

Cependant, je reçois l'erreur: ScannerError: valeurs de mappage ne sont pas autorisés ici

montrant les espaces blancs après story. J'ai essayé une suggestion proposée par un répondeur ci-dessous, à savoir créer l'expression yaml à partir d'un dictionnaire python. Cela marche. Je sauvegarde le yaml dans un fichier et le recharge à nouveau. Cependant, lorsque je crée la yaml en tapant les caractères exactement les mêmes, il ne fonctionne pas ...

EDIT2: Je pense que le problème vient du fait que j'ai créé le fichier YAML sur une machine de fenêtre et uploadé il sur un serveur UNIX.

+0

Où est le code qui a un problème avec cela? Quelle bibliothèque utilisez-vous? Ou essayez-vous d'analyser YAML avec des expressions régulières? (Vous ne devriez pas) – Anthon

Répondre

1

Il est facile de trouver le format YAML correct pour une structure: créer la structure en Python puis utilisez yaml.dump pour créer la chaîne codée YAML:

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

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

Le résultat est:

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

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

C'est la représentation YAML correcte, donc si vous rencontrez un problème, c'est avec l'analyseur, pas le texte d'entrée. Si vous utilisez la bibliothèque standard yaml, elle devrait bien analyser.

+0

Il n'y a pas d'analyseur yaml dans la bibliothèque Python standard pour une version de Python. – Anthon

+0

@Chris Johnson Oui, vous avez raison, cela fonctionne comme ça. Mon problème est que j'ai essayé d'écrire le yaml (im sur linux debian, avec vim) et de le charger dans un cahier python en utilisant 'import yaml avec open ('/ home/depot/wintergreen/yaml/scrapers.yml ',' r ') comme f: grattoirs = yaml.load (f) '. Là, je reçois une erreur qui pointe sur les espaces après 'story':' ScannerError: les valeurs de mapping ne sont pas autorisées ici'.J'ai essayé de copier coller l'expression yaml générée avec votre méthode dans vim, et il lance toujours la même erreur. Peut-être que c'est un problème d'encodage? –

+0

@Anthon faites-vous une distinction entre bibliothèque et bibliothèque standard? 'pip install pyyaml' suivi de' import yaml' fonctionne bien. C'est un choix très commun. –