从Xpath查询中获取属性和文本作为列表

时间:2014-09-13 18:34:04

标签: python xpath lxml

我想查询html字符串并将href属性和文本节点从超链接提取到列表(或任何其他字典)。

请考虑以下代码:

from lxml import html
str = '<a href="href1"> Text1 </a>' \
      '<a href="href2"> Text2 </a>' \
      '<a href="href3"> Text3 </a>'
tree = html.fromstring(str)
items = tree.xpath('//a')

values = list()
for item in items:
    text = item.text
    href = item.get('href')
    values.append((text, href))

for text, href in values:
    print text, href

这个有效!

我想知道是否可以省略for item in items:循环并使用XPath查询获取values列表。

tree.xpath('//a/text()')tree.xpath('//a/@href')给我任意一个 - 但我希望列表中包含两个值。

2 个答案:

答案 0 :(得分:2)

您可以使用|构建复合XPath。 text和hrefs都将在单个列表items中返回。您可以使用grouper recipezip(*[iterable]*2)对每两项进行配对。 (但请注意,这依赖于hrefs和文本字符串交替):

from lxml import html
str = '<a href="href1"> Text1 </a>' \
      '<a href="href2"> Text2 </a>' \
      '<a href="href3"> Text3 </a>'
tree = html.fromstring(str)
items = tree.xpath('//a/text() | //a/@href')

for href, text in zip(*[iter(items)]*2):
    print text, href

产量

 Text1  href1
 Text2  href2
 Text3  href3

答案 1 :(得分:1)

您可以使用zip

a = [1, 2, 3]
b = ['a', 'b', 'c']
zip(a, b) # [(1, 'a'), (2, 'b'), (3, 'c')]

所以根据你的xpath表达式:

texts = tree.xpath('//a/text()')
hrefs = tree.xpath('//a/@href')
values = zip(texts, hrefs)