我想查询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')
给我任意一个 - 但我希望列表中包含两个值。
答案 0 :(得分:2)
您可以使用|
构建复合XPath。 text和hrefs都将在单个列表items
中返回。您可以使用grouper recipe,zip(*[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)