scrapy response.xpath возвращает пустой массив в документе XML с пространством имен по умолчанию, в то время как response.re работает

Я новичок в лоскутном деле, и я играл со скребковой оболочкой, пытаясь просканировать этот сайт: http://www.spiegel.de/sitemap.xml

Я сделал это с

scrapy shell "http://www.spiegel.de/sitemap.xml"

и все отлично работает, когда я использую

response.body 

я могу видеть всю страницу, включая теги XML

однако, например, это:

response.xpath('//loc') 

просто не будет работать.

В результате я получаю пустой массив

в то время как

response.selector.re('somevalidregexpexpression') 

должно сработать

Любая идея, что может быть причиной? может быть связано с кодировкой или так? сайт не utf-8

Я использую Python 2.7 на Win 7. Я попробовал xpath() на другом сайте (dmoz), и он работал нормально.

2 ответа

Решение

Проблема была из-за пространства имен поумолчанию, объявленного в корневом элементе XML:

xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"

Таким образом, в этом XML корневой элемент и его потомки без префикса неявно наследуют одно и то же пространство имен.

С другой стороны, в XPath вам нужно использовать префикс, связанный с URI пространства имен, для ссылки на элемент в этом пространстве имен, такоепространство имен по умолчанию не подразумевается.

Ты можешь использоватьselector.register_namespace() чтобы связать префикс пространства имен с URI пространства имен по умолчанию, а затем использовать префикс в вашем XPath:

response.selector.register_namespace('d', 'http://www.sitemaps.org/schemas/sitemap/0.9')
response.xpath('//d:loc')

Вы также можете использовать xpath с локальным пространством имен, например:

response.xpath("//*[local-name()='loc']")

Это особенно полезно, если вы анализируете ответы из нескольких разнородных источников и не хотите регистрировать каждое пространство имен.

Другие вопросы по тегам