在Python中,我如何使用XPath计算节点? 例如,使用this webpage和此代码:
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 :(得分:0)
它打印1(或1.0),因为在你提取的HTML文件中只有一个这样的元素id="body"
。
我下载了文件并验证了这种情况。 E.g:
$ 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解析非常具有挑战性。很多不良数据和许多复杂的标记都会超过检索,解析和遍历过程的复杂性。您可能会多次运行测试和试验。如果你不这样做,它将会快得多#34;对于他们每个人。缓存实时结果。原始代码看起来像这样:
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)来简化其中的大部分内容。快乐解析!