2014-11-13 5 views
0

В Python, как я могу подсчитать узлы с помощью XPath? Например, используя this webpage и этот код:Самый эффективный способ подсчета узлов с использованием XPath в Python

from lxml import html, etree 
import requests 
url = "http://intelligencesquaredus.org/debates/past-debates/item/587-islam-is-dominated-by-radicals" 
r = requests.get(url) 
tree = html.fromstring(r.content) 
count = tree.xpath('count(//*[@id="body"])') 
print count 

Он печатает 1. Но это имеет 5 div узлов. Пожалуйста, объясните это мне и как я могу это сделать правильно?

ответ

0

Он печатает 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. Счастливый разбор!

+0

спасибо. почему он печатает в float, а не int? – f4fc2791e4473eb2ba41b5ddb445b2

+0

Потому что XPath 1.0 делает все так. XPath 2.0 вернет более ожидаемый целочисленный результат. [См. Этот вопрос для более глубокого объяснения] (http://stackoverflow.com/questions/17960497/why-xpath-count-function-returns-a-double-instead-of-int) –

Смежные вопросы