循环插入字典 - Python

时间:2015-08-02 18:07:43

标签: python dictionary xpath

我是Z / OS,AS / 400的Cobol,我正在尝试学习新的编程语言,在家里做一些事情。所以我选择了Python并开始试一试。

但是现在我遇到了一个问题,我无法理解为什么会发生这种情况,我已经在很多教程和其他关于这里的词典的问题上进行了很多研究,但我仍然不知道我在做什么做错了,任何澄清都要真的很感激。

所以,我正在尝试做的是,我使用lxml进入服务器上的页面,并从中返回一个文本列表及其相应的链接,之后,我想创建一个包含两者的字典结果(文本作为键和链接作为值),但事情并没有像我预期的那样继续。这是我的实际代码:

from lxml import html
import requests
page = requests.get('http://myexample.com.br/manga/')
tree = html.fromstring(page.text)
namelist = tree.xpath('//div[@class="manga_list"]/ul/li/a/text()')
linklist = tree.xpath('//div[@class="manga_list"]/ul/li/a/@href')
ind1 = 0
listall = {}
while ind1 < len(namelist):
   print "Name", namelist[ind1]
   print "Link", linklist[ind1]
   listall[namelist[ind1]] = linklist[ind1]
   print "Key", listall.keys()[ind1]
   print "Index", ind1
   ind1 += 1

正如你所看到的,我已经在循环中添加了一些打印行,所以我可以在终端中看到当前正在使用的内容,这就是我得到的结果, 键不断重复,因此它们不包括在内,但循环迭代中使用的当前名称和链接是正确的......所以我真的没有得到这里发生的事情......

Andres-MacBook-Pro:Documents Andre$ python teste.py
Name -6mm no Taboo
Link http://myexample.com.br/manga/6mm_no_taboo/
Key -6mm no Taboo
Index 0
Name -Rain-
Link http://myexample.com.br/manga/rain/
Key -6mm no Taboo
Index 1
Name -SINS-
Link http://myexample.com.br/manga/sins/
Key -6mm no Taboo
Index 2
Name :REverSAL
Link http://myexample.com.br/manga/reversal/
Key -6mm no Taboo
Index 3
Name ...Curtain
Link http://myexample.com.br/manga/curtain/
Key -6mm no Taboo
Index 4
Name ...Junai no Seinen
Link http://myexample.com.br/manga/junai_no_seinen/
Key ...Junai no Seinen
Index 5
Name ...no Onna
Link http://myexample.com.br/manga/no_onna/
Key ...Junai no Seinen
Index 6
Name ...Seishunchuu!
Link http://myexample.com.br/manga/seishunchuu/
Key ...Junai no Seinen
Index 7
Name ...Virgin Love.
Link http://myexample.com.br/manga/virgin_love/
Key ...Junai no Seinen
Index 8
Name .925 (NISHI Uko)
Link http://myexample.com.br/manga/925_nishi_uko/
Key ...Junai no Seinen
Index 9
Name .hack//4koma
Link http://myexample.com.br/manga/hack_4koma/
Key ...Junai no Seinen
Index 10
Name .hack//Alcor
Link http://myexample.com.br/manga/hack_alcor/
Key ...Junai no Seinen
Index 11
Name .hack//G.U.+
Link http://myexample.com.br/manga/hack_g_u/
Key ...Junai no Seinen
Index 12
Name .Hack//GnU
Link http://myexample.com.br/manga/hack_gnu/
Key ...Junai no Seinen
Index 13
Name .hack//Link
Link http://myexample.com.br/manga/hack_link/
Key ...Junai no Seinen
Index 14
Name .hack//Tasogare no Udewa Densetsu
Link http://myexample.com.br/manga/hack_tasogare_no_udewa_densetsu/
Key ...Junai no Seinen
Index 15
Name .hack//XXXX
Link http://myexample.com.br/manga/hack_xxxx/
Key ...Junai no Seinen
Index 16
Name .traeH
Link http://myexample.com.br/manga/traeh/
Key ...Junai no Seinen
Index 17
Name 'Hajimete' Ageru!
Link http://myexample.com.br/manga/hajimete_ageru/
Key ...Junai no Seinen
Index 18
Name "Aishiteru", Uso Dakedo.
Link http://myexample.com.br/manga/aishiteru_uso_dakedo/
Key ...Junai no Seinen
Index 19
Name "Aoi" - Hikaru ga Chikyuu ni Itakoro......
Link http://myexample.com.br/manga/aoi_hikaru_ga_chikyuu_ni_itakoro/
Key ...Junai no Seinen
Index 20
Name "Bungaku Shoujo" to Ue Kawaku Yuurei
Link http://myexample.com.br/manga/bungaku_shoujo_to_ue_kawaku_yuurei/
Key ...Virgin Love.
Index 21

1 个答案:

答案 0 :(得分:1)

字典没有顺序,因此您获取密钥(对于dict.keys())调用的顺序可能与您预期的不同(这似乎是这种情况)。如果你真的想检查词典中的所有内容,你可以尝试打印完整的词典(或者完整的dict.keys())。示例 -

print "Listall", listall

或者

print "Keys",  listall.keys()

此外,我不是100%确定xpath是否总是以完全相同的顺序返回元素,但我会说最好不要冒险。您可以像 -

一样运行xpath
tree.xpath('//div[@class="manga_list"]/ul/li')

然后对于上面xpath结果中的每个元素,运行两个xpath来获取文本和相应的href,例如 -

from lxml import html
import requests
page = requests.get('http://myexample.com.br/manga/')
tree = html.fromstring(page.text)
lilist = tree.xpath('//div[@class="manga_list"]/ul/li')
listall = {}
for lielem in lilist:
    name = lielem.xpath('./a/text()')
    link = lielem.xpath('./a/@href')
    print "Name", name
    print "Link", link
    listall[name] = link
    print "Keys", listall.keys()

如果您想要此后的名单和链接列表,只需执行 - listall.keys()(用于名称列表)和listall.values()(用于值列表)。

如果您想保留插入密钥的顺序,可以使用 - collections.OrderedDict,示例 -

from lxml import html
import requests
from collections import OrderedDict
page = requests.get('http://myexample.com.br/manga/')
tree = html.fromstring(page.text)
lilist = tree.xpath('//div[@class="manga_list"]/ul/li')
listall = OrderedDict()
ind = 0
for lielem in lilist:
    name = lielem.xpath('./a/text()')
    link = lielem.xpath('./a/@href')
    print "Name", name
    print "Link", link
    listall[name] = link
    print "Keys", listall.keys()[ind]
    ind += 1