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']")
Это особенно полезно, если вы анализируете ответы из нескольких разнородных источников и не хотите регистрировать каждое пространство имен.