用于推广XPath选择器的方法

时间:2012-04-02 10:56:10

标签: xpath

从我在firefox上的网页上看这是一个xpath选择器。

id('ls-page')/x:div[5]/x:div[1]/x:div[2]/x:table/x:tbody/x:tr[2]/x:td[2]/x:a

所以我删除/ x:tbody,因为它是由firefox添加的。但是如何在表中获得具有相同基本Xpath的链接。唯一明显的区别是,对于表中的每个链接,tr增加1。

id('ls-page')/x:div[5]/x:div[1]/x:div[2]/x:table/x:tr[2]/x:td[2]/x:a
id('ls-page')/x:div[5]/x:div[1]/x:div[2]/x:table/x:tr[3]/x:td[2]/x:a

如果页面上有连续的链接表。而对我来说唯一的区别似乎是div从1增加到2。

所以第二个表链接。

id('ls-page')/x:div[5]/x:div[2]/x:div[2]/x:table/x:tr[2]/x:td[2]/x:a

/x:div[5]/x:div[1]

变为

/x:div[5]/x:div[2]

1)是否有用于概括XPATH选择器的方法或过程?

2)对于每个表,我是否必须创建两个单独的通用函数,一个用于检索表,另一个用于从表中检索链接?

注意我指的是此网站live nrl stats。我一直在阅读scrapy文档和beautifulsoup文档,但我对我正在学习的工具建议持开放态度。

1 个答案:

答案 0 :(得分:1)

XPATH是一种查询语言,我不知道任何自动化的查询概括方法,这是你必须根据文档结构自行解决的问题。

我首选的资料库是lxml.etree。这是一个简单的查询工作示例,它应该返回所有匹配链接。

我已将html保存到工作目录中,以避免在测试时经常访问网站。

from lxml import etree
import os
local_file = 'season2012.html'
url = "http://live.nrlstats.com/nrl/season2012.html"

if not os.path.exists(local_file):
  from urllib2 import urlopen
  data = urlopen(url).read()
  with open(local_file,'w') as f:
    f.write(data)
else:
  with open(local_file,'r') as f:
    data = f.read()

doc = etree.HTML(data)
for link in doc.xpath('//table[@class="tablel"]/tr/td[2]/a'):
  print "%s\t%s" % (link.attrib['href'],link.text)

产量:

/matches/nrl/match15300.html    Melbourne v Newcastle
/matches/nrl/match15291.html    Brisbane v St George Illawarra
/matches/nrl/match15313.html    Penrith v Cronulla
/matches/nrl/match15312.html    Parramatta v Manly
/matches/nrl/match15311.html    Sydney Roosters v Warriors
[truncated]

我建议使用交互式python解释器在此示例中使用ElementTree对象doc来测试您的查询,并查看其他XPATH问题和答案,以便查询工作查询帮助你学习的例子。