在Python中使用XPath计算节点的最有效方法

问题描述 投票:0回答:1

在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
节点。 请向我解释一下,我怎样才能正确地做到这一点?

python web-scraping xpath python-requests lxml
1个回答
1
投票

它会打印 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。 解析愉快!

© www.soinside.com 2019 - 2024. All rights reserved.