Я использую 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
Да. Я получаю строку. Благодарю. Можете ли вы также разработать проблему с подходом, который я принял. –
Насколько я понимаю, когда выражение XPath выбирает набор узлов, то в Python вы получаете список, пустой, если выбранный набор узлов пуст или список с выбранными узлами, если узлы элемента где выбрано, или в случае выбора текстового узла или узла атрибута, список со смарт-строками. Если вы знаете, что ваш XPath выбирает хотя бы один атрибут и вы хотите его значение вместо списка с одним значением, вы всегда можете сделать «tree.xpath (xpath) [0]». –
Да, я могу, но я пишу это как часть цикла, где не все виды xpath возвращают один элемент. Поэтому запись 'tree.xpath (xpath) [0]' не является опцией, но решение выше работает отлично. –