2015-12-25 2 views
1

Я использую lxml, и у меня есть сломанная страница от Google Scholar. Ниже приведен минимальный рабочий пример и те вещи, которые я пробовал.force xpath для возврата строки lxml

In [56]: seed = "https://scholar.google.com/citations?view_op=search_authors&hl=en&mauthors=label:machine_learning" 

In [60]: page = urllib2.urlopen(seed).read() 

In [63]: tree = html.fromstring(page) 

In [64]: xpath = '(/html/body/div[1]/div[4]/div[2]/div/span/button[2]/@onclick)[1]' 

In [65]: tree.xpath(xpath) 
#first element returns as list 
Out[65]: ["window.location='/citations?view_op\\x3dsearch_authors\\x26hl\\x3den\\x26oe\\x3dASCII\\x26mauthors\\x3dlabel:machine_learning\\x26after_author\\x3dVCoCALPY_v8J\\x26astart\\x3d10'"]   

In [66]: xpath = '(/html/body/div[1]/div[4]/div[2]/div/span/button[2]/@onclick)[2]' 

#there is no second element 
In [67]: tree.xpath(xpath) 
Out[67]: []  

In [70]: xpath = '(/html/body/div[1]/div[4]/div[2]/div/span/button[2]/@onclick)' 

#The list contains only one element 
In [71]: tree.xpath(xpath) 
Out[71]: ["window.location='/citations?view_op\\x3dsearch_authors\\x26hl\\x3den\\x26oe\\x3dASCII\\x26mauthors\\x3dlabel:machine_learning\\x26after_author\\x3dVCoCALPY_v8J\\x26astart\\x3d10'"]   

Согласно документации here, возвращаемые значения могут быть умные строки, но я не могу получить выходную строку из функции XPATH. Как я могу написать xpath, чтобы получить строку из xpath

ответ

4

Вы можете использовать выражение XPath string(/html/body/div[1]/div[4]/div[2]/div/span/button[2]/@onclick), в этом случае вы получите простое строковое значение.

+0

Да. Я получаю строку. Благодарю. Можете ли вы также разработать проблему с подходом, который я принял. –

+0

Насколько я понимаю, когда выражение XPath выбирает набор узлов, то в Python вы получаете список, пустой, если выбранный набор узлов пуст или список с выбранными узлами, если узлы элемента где выбрано, или в случае выбора текстового узла или узла атрибута, список со смарт-строками. Если вы знаете, что ваш XPath выбирает хотя бы один атрибут и вы хотите его значение вместо списка с одним значением, вы всегда можете сделать «tree.xpath (xpath) [0]». –

+0

Да, я могу, но я пишу это как часть цикла, где не все виды xpath возвращают один элемент. Поэтому запись 'tree.xpath (xpath) [0]' не является опцией, но решение выше работает отлично. –