Тег разбора Python XPath с апострофом - PullRequest
7 голосов
/ 11 декабря 2011

Я новичок в XPath.Я пытаюсь разобрать страницу с помощью XPath.Мне нужно получить информацию из тега, но избежание апострофа в заголовке все испортило.

Для анализа я использую Grab .

тег из источника:

<img src='somelink' border='0' alt='commission:Alfred\'s misadventures' title='commission:Alfred\'s misadventures'>

Фактическая XPath:

g.xpath('.//tr/td/a[3]/img').get('title')

Возвращает

commission:Alfred\\

Есть ли способ исправить это?

Спасибо

Ответы [ 2 ]

5 голосов
/ 11 декабря 2011

Мусор на входе, мусор на выходе.Ваш ввод не является правильным, потому что он неправильно экранирует символ одинарной кавычки.Многие языки программирования (включая Python) используют символ обратной косой черты для экранирования кавычек в строковых литералах.XML нет.Вы должны либо 1) заключить значение атрибута в двойные кавычки;или 2) используйте &apos; для включения одинарной кавычки .

С спецификации XML :

Чтобы разрешить значения атрибутовсодержат одинарные и двойные кавычки, символ апостроф или одинарная кавычка (') может быть представлен как "&apos;", а символ двойной кавычки (") -" &quot; ".

1 голос
/ 11 декабря 2011

Поскольку предоставленный «XML» не является правильно сформированным документом из-за вложенных апострофов, выражение XPath не может быть оценено на нем .

Предоставленный не правильно сформированный текст можетисправить на:

<img src="somelink"
 border="0"
 alt="commission:Alfred's misadventures"
 title="commission:Alfred's misadventures"/>

Если есть странное требование не использовать кавычки, то одно правильное преобразование будет :

<img src='somelink'
 border='0'
 alt='commission:Alfred&apos;s misadventures'
 title='commission:Alfred&apos;s misadventures'/>

ЕслиВам предоставлен неправильный ввод, на языке, таком как C #, можно попытаться преобразовать его в его правильный аналог, используя :

string correctXml = input.replace("\\'s", "&apos;s")

Возможно, есть аналогичный способ сделать то же самое в Python.

...