Он печатает 1 (или 1.0), потому что в файле HTML, который вы извлекаете, есть только один такой элемент с id="body"
.
Я скачал файл и подтвердил, что это так. Например .:
$ curl -O http://intelligencesquaredus.org/debates/past-debates/item/587-islam-is-dominated-by-radicals
Хватает файл 587-islam-is-dominated-by-radicals
$ grep --count 'id="body"' 587-islam-is-dominated-by-radicals
Ответы 1. Просто быть очень точно, я вручную ищется в файле, а также, используя VI. Просто один!
Возможно, вы ищете другой узел div
? Один с другим id
?
Обновление: Кстати, XPath и другие синтаксисы HTML/XML довольно сложно работать. Много плохих данных там, и много сложной разметки, времена сложности поиска, разбора и обхода процесса. Вы, вероятно, будете проводить тесты и испытания много раз. Это будет намного быстрее, если вы не «попадете в сеть» для каждого из них. Получите кеш-результаты. Сырой код выглядит примерно так:
from lxml import html, etree
import requests
filepath = "587-islam-is-dominated-by-radicals"
try:
contents = open(filepath).read()
print "(reading cached copy)"
except IOError:
url = "http://intelligencesquaredus.org/debates/past-debates/item/587-islam-is-dominated-by-radicals"
print "(getting file from the net; please stand by)"
r = requests.get(url)
contents = r.content
tree = html.fromstring(contents)
count = tree.xpath('count(//*[@id="body"])')
print count
Но вы можете упростить много, что с помощью общего кэширования переднего конца requests
, такой как requests-cache. Счастливый разбор!
спасибо. почему он печатает в float, а не int? – f4fc2791e4473eb2ba41b5ddb445b2
Потому что XPath 1.0 делает все так. XPath 2.0 вернет более ожидаемый целочисленный результат. [См. Этот вопрос для более глубокого объяснения] (http://stackoverflow.com/questions/17960497/why-xpath-count-function-returns-a-double-instead-of-int) –