循环过早结束

时间:2013-07-26 10:10:06

标签: python sqlite parsing lxml

以下是我的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3
import lxml.cssselect
import lxml.html
import xml.etree.ElementTree as etree
import urllib

db = sqlite3.connect('abiturient.sqlite')
sql = db.cursor()

query = "DELETE FROM universities"
sql.execute(query)

regions = sql.execute('SELECT * FROM regions')
for region in regions:
    doc = lxml.html.document_fromstring(urllib.urlopen(region[2]).read())

    for topic in doc.xpath('//span[@id="branch2"]/a'):
        name = topic.text_content().replace("'", "''")
        link = 'http://vstup.info/2013' + topic.attrib['href'][1:-5] + 'b.html'
        region_id = str(region[0])

        sql.execute("INSERT INTO universities (id, name, link, region_id) VALUES (NULL, '" + name + "', '" + link + "', '" + region_id + "')")

    print region[1] + ': added.'

db.commit()
db.close()

我的表regions由三个条目组成(三个用于解析的链接)。我从SQLite中选择它们并使用lxml解析它们。但是有一个问题:循环for region in regions:只执行一次传递(仅解析第一个链接并停止而没有错误)。我不知道发生这种情况的原因。也许是因为在循环中有一个循环?

1 个答案:

答案 0 :(得分:0)

对于那些 - 像我一样 - 迟到的人来说,问题出在声明中:

regions = sql.execute('SELECT * FROM regions')

你从执行调用返回的是用于调用的光标。正如Rapolas K建议的那样,答案实际上是使用该游标获取记录 - 如下: / p>

regions = sql.execute('SELECT * FROM regions').fetchall()

或:

sql.execute('SELECT * FROM regions')
regions = sql.fetchall()