2010-05-25 6 views
0

J'utilise XPath avec scrapy pour extraire du texte à partir de balises html en ligne, mais quand je le fais, je reçois des caractères supplémentaires. Un exemple est d'essayer d'extraire un nombre, comme "204" à partir d'un tag <td> et obtenir [u'204']. Dans certains cas, c'est bien pire. Par exemple en essayant d'extraire "1 - Mathoverflow" et d'obtenir à la place [u'\r\n\t\t 1 \u2013 MathOverflow\r\n\t\t ']. Y at-il un moyen d'empêcher cela, ou couper les chaînes de sorte que les caractères supplémentaires ne sont pas une partie de la chaîne? (en utilisant des éléments pour stocker les données). Il semble que cela a quelque chose à voir avec le formatage, alors comment puis-je obtenir xpath pour ne pas prendre ce genre de choses?Caractères supplémentaires Extrait avec XPath et Python (html)

+0

Cela nous aiderait beaucoup si vous pouvez fournir un exemple de code autonome complet qui reproduit vos problèmes. Nous essayons de deviner ce que vous faites. –

Répondre

2

Qu'est-ce que la ligne de regard de code comme ça retourne [u'204']? Il semble que ce qui est renvoyé est une liste Python contenant une chaîne unicode avec la valeur que vous voulez. Rien là-bas - juste un indice. En ce qui concerne les retours de chariot, les sauts de ligne et les onglets, comme Wai Yip Tung vient de répondre, la bande les enlèvera.

probablement

my_answer = item1['Title'][0].strip() 

Ou si vous attendez plusieurs matchs

for ans_i in item1['Title']: 
    do_something_with(ans_i.strip()) 
+1

Ok merci, cela a corrigé un peu, il semble prendre le tiret dans '1 - MathOverflow' comme une chaîne étrange' 'u 2013', et ascii ne peut pas le lire. En ce qui concerne le [u'204 '], je ne sais pas pourquoi xpath le met autour des données. L'instruction xpath est '// div [@ id =" content "]/div [@ id =" liste-répertoire "]/div [@ class =" wrapper "]/table/tr [@ class =" impair "] [1]/td [1]/text() ' – Kristin

+0

Je pense que vous confondez ce qui est actuellement retourné avec la façon dont Python le rend quand il l'imprime à l'invite. Quand vous voyez '[u'204 ']' sur l'écran, ce n'est pas une chaîne qui commence par un caractère '['. Plutôt, c'est comme cela que Python vous dit qu'il vous montre un objet liste qui contient une seule chaîne unicode. La valeur à l'intérieur de cette chaîne unicode est les trois caractères '2',' 0' et '4'. Ce qui est exactement ce que vous voulez. Le code que je vous ai montré devrait déballer ça pour vous. –

+0

De même, Python ne remplace pas le tiret avec la chaîne '\ u2013'. Plutôt, c'est juste de vous montrer que la chaîne Unicode qui a été retournée contient le caractère au point de code 2013. Ce qui, vous ne serez pas surpris de l'apprendre, est le codepoint pour "EN DASH". Python ne modifie pas la chaîne, il retourne exactement ce qu'il y a dans le navigateur. Si vous voulez supprimer le caractère non-ascii, ce thread récent vous aidera: http://stackoverflow.com/questions/2854230/whats-the-fastest-way-to-strip-and-replace-a-document-of -high-unicode-characters –

1

Utilisez la bande() pour supprimer les espaces blancs avant et arrière.

>>> u'\r\n\t\t 1 \u2013 MathOverflow\r\n\t\t '.strip() 
u'1 \u2013 MathOverflow' 
+0

comment ferais-je cela dans le programme? puis-je juste écrire 'item1 ['Title'] = item1 ['title']. strip()' ,? Je suis nouveau à python. – Kristin

+0

Oui, en supposant que item1 ['title'] est une chaîne. –

2

La fonction standard XPath normalize-space() a exactement l'effet recherché.

Il supprime les espaces de début et de fin et remplace tout espace intérieur par un seul espace.

Ainsi, vous pouvez utiliser:

normalize-space(someExpression)

+0

Ah ok, alors comment va la syntaxe? ('normalize-space (// div [@ id = "content"]/div [@ id = "répertoire-liste"]/div [@ class = "wrapper"]/table') items = [] ') correct? – Kristin

+0

@Nacari: Ceci est une expression XPath correcte: 'normaliser-espace (// div [@ id =" contenu "]/div [@ id =" répertoire-liste "]/div [@ class =" wrapper " ]/table) –