В Python3 print
— это функция, которая выводит на экран и возвращает None
. (В Python2 print
— это оператор, и код выдаст ошибку, поскольку вы не можете поместить оператор в середину выражения.) Вместо этого для построения строки используйте метод format
:
content = "string(//div[@id='article']/p[{}]/.)".format(i)
И, кстати, вы должны иметь возможность использовать position()
с lxml. Например,
import lxml.html as LH
content = '''\
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
<book>
<title lang="eng">Things Fall Apart</title>
<price>19.99</price>
</book>
<book>
<title lang="eng">Blood Meridian</title>
<price>9.99</price>
</book>
</bookstore>'''
root = LH.fromstring(content)
# Compare with https://stackoverflow.com/a/39242701/190597
print(root.xpath('//book[position()>=1 and position()<=last()]/title/text()'))
# ['Harry Potter', 'Learning XML', 'Things Fall Apart', 'Blood Meridian']
# But note that it is equivalent to
print(root.xpath('//book/title/text()'))
# ['Harry Potter', 'Learning XML', 'Things Fall Apart', 'Blood Meridian']
print(root.xpath('//book[position()<3]'))
отпечатки
['Harry Potter', 'Learning XML']
который показывает, что вы можете выбрать первый N
books
без необходимости зацикливаться.
Как отмечает Томалак, функция XPath string
возвращает только строковое представление первый узел. Например,
print(root.xpath('string(//book[position()<3]/title/text())'))
только печатает
Harry Potter
Если вам нужен список строк, не используйте string
.
Если, как указывает Дэниел Хейли желаемый текст находится в смеси вложенных узлов и дочерних элементов, например. <title lang="eng">Harry <b>Potter</b></title>
, то можно извлечь нужный текст методом text_content
:
[title.text_content() for title in root.xpath('//book[position()<3]/title')]
person
unutbu
schedule
31.08.2016