Response.xpath("//body")
возвращает body of 'html' element содержащийся в ответ, в то время как response.body
возвращает тело (or message-body) всего ответа HTTP (так что все HTML в ответ включая головки & элементов кузова).
Response.xpath("//body")
- это на самом деле ярлык, который преобразует тело ответа HTTP в объект Selector, который можно перемещать с помощью xpath.
Ссылки, которые вам нужны, содержатся в корпусе элемента html, они не могут быть нигде больше, я не уверен, почему вы предполагаете, что их там нет. response.xpath("//body//a/@href")
предоставит вам все ссылки на странице, вам, вероятно, потребуется создать правильный xpath, который будет выбирать только те ссылки, которые вам нужны.
Длина response.xpath("//body")
что вы упоминаете в вашем примере является результатом того, что ваш первый пример len(response.xpath('//body').extract())
возвращает число элементов тела в HTML документа, список response.xpath.extract()
возврата элементов, соответствующих XPath. В документе есть только одно тело. В вашем втором примере len(response.xpath('//body')).extract()[0])
вы фактически получаете элемент body как строку, и вы получаете длину строки (количество символов, содержащихся в теле). len(response.body)
также дает вам количество символов всего HTTP-ответа, число которых, скорее всего, выше, потому что html HEAD содержит множество скриптов и таблиц стилей, которых нет в теле HTML.
Похоже, проблема связана с недопустимой разметкой HTML на этой странице - у нее есть несколько тегов, которые не были закрыты (проверьте это с помощью http://validator.w3.org). – elias
Как вы думаете, я должен это исправить? вы рекомендуете библиотеку, которая может исправить этот недопустимый html? – Vanddel
Итак, оказывается, что у lxml есть способ обойти это - lemme добавить правильный ответ. – elias