在Python中,如何使用XPath计算节点数? 例如,使用此网页和以下代码:
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
节点。
请向我解释一下,我怎样才能正确地做到这一点?
它会打印 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。 解析愉快!