2016-02-12 41 views
1

我期待从this页提取每个指令ID:合法Xpath查询的urllib2牵强

enter image description here

import lxml.html as lh 
url ='https://secure.ssa.gov/apps10/reference.nsf/instructiontypecode!openview&restricttocategory=POMT' 
response = urllib2.urlopen(url) 
content = response.read() 
root = lh.fromstring(content) 
all_instruction_ids = root.xpath(XPATH_ALL_INSTRUCTION_IDS) 

我已经试过了无数的XPath由Chrome & Firebug的开发工具,萤火虫和其他浏览器给我的表情加载项:

XPATH_ALL_INSTRUCTION_IDS = '//*[@id="content"]/div/div/div[2]/table/tbody/tr/td[1]/font/a/.' 
#XPATH_ALL_INSTRUCTION_IDS = '//*[@id="content"]/div/div/div[2]/table/tbody/tr/td[1]/font/a/text()' 
XPATH_ALL_INSTRUCTION_IDS = '//*[@id="content"]/div/div/div[2]/table/tbody/tr/td[1]/font/a[contains(normalize-space(), "")]' 
XPATH_ALL_INSTRUCTION_IDS = '//*[@id="content"]/div/div/div[2]/table/tbody/tr/td[1]/font/a' 
XPATH_ALL_INSTRUCTION_IDS = ".//*[@id='content']/div/div/div[2]/table/tbody/tr[2]/td[1]/font/a" 
XPATH_ALL_INSTRUCTION_IDS = "//form/div[1]/div[5]/div/div/div[2]/table/tbody/tr/td[1]/font/a" 
XPATH_ALL_INSTRUCTION_IDS = "id('content')/div/div/div[2]/table/tbody/tr/td[1]/font/a" 
XPATH_ALL_INSTRUCTION_IDS = "/html/body/form/div[1]/div[5]/div/div/div[2]/table/tbody/tr/td[1]/font/a" 
XPATH_ALL_INSTRUCTION_IDS = "//html//body/form/div[1]/div[5]/div/div/div[2]/table/tbody/tr/td[1]//a" 
XPATH_ALL_INSTRUCTION_IDS = "//html//body/form/div[1]/div[5]/div/div/div[2]/table/tbody/tr/td[1]/*/a" 

ÿ当它们传递到xpath()的方法lxml.html.fromstring()

+0

仔细观察,图像也存在于直播源中(它只是没有显示),所以它必须是别的东西。 – Pyderman

回答

1

我会找到包含reference.nsf/links内的href所有链接:

//table//a[contains(@href, 'reference.nsf/links')]/text() 

为我工作。

+0

不错。如果hrefs指向的路径每改变一次,这都会中断,但是对于其他工作查询的健壮性或缺乏相同可能是相同的。 – Pyderman

+0

@Pyderman好吧,我刚刚在hrefs中发现了这个'reference.nsf/links'共同部分。我不认为这比'// font/a'更可靠 - 'font'标签本身是定位器内部使用的不好的选择,因为它是style/ui/design特定的,而不是数据导向的。 – alecxe

+0

@Pyderman指出,在这种情况下,我们甚至可以使用'//表// a/text()',因为表中的所有链接都是指令ID .. – alecxe

1

// xpath操作符不需要您从文档的顶部开始。

XPATH_ALL_INSTRUCTION_IDS = '//font/a' 

我建议你看看xpath cheatsheet

+0

确实如此,最后我使用'// tr/td [1]/font/a /。'但这是一个很脆弱的查询,而且很容易中断。这是我第一次遇到一个页面元素,它不会被完全形成的查询直接返回到根。我很困惑,为什么在浏览器中生成的这些合法查询不能在urllib2看到的页面源代码上工作。 – Pyderman