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

时间:2014-11-13 19:38:55

标签: python xpath lxml python-requests scrape

在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个节点。 请向我解释一下,我该如何正确地做到这一点?

1 个答案:

答案 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)来简化其中的大部分内容。快乐解析!