Найти - Пользователи
Полная версия: импорт данных из HTML таблицы через lxml в MySQL
Начало » Python для новичков » импорт данных из HTML таблицы через lxml в MySQL
1 2 3 4
ruff3d
PooH
Как я понимаю - он выводит несколько строчек, а потом вылетает? Или наоборот до этого выводил несколько строчек, а потом вылетал, а после переделки вылетает сразу. Если так, то возвращаемся к тому, с чего я и начинал - в макете таблиц в строках разное число ячеек. Больше предположений нет, если хотите высылайте мне на почту свой скрипт и пример хтмла, посмотрю.

на почту скинул!
PooH
ruff3d
на почту скинул!
Ну как я и предполагал, дело в структуре документа. Внутри нужной вам таблицы есть вложенные и под ваши правила попадают и они тоже. Я немного поигрался с документом, предлагаю парсить так: берем tbody нужной таблицы по id(верстальщику привет, id “nestedView:details:data” - это думали не головным мозгом). И идем по дочерним элементам. Я вот тут накидал, вставку в базу сами прикрутите.
    def print_tuple(t):
        for j, x in enumerate(t):
            print "%d:" % j, x
    doc = html.document_fromstring(open(r).read())
    tbody = doc.cssselect('#"nestedView:details:data">tbody')[0]
    def get_content(td):
        try:
            return td.text_content().strip() or td.cssselect('a')[0].get('href')
        except IndexError:
            return None
    for i, tr in enumerate(tbody):
        tup = tuple(get_content(x) for x in tr)
        print i, "=" * 25
        print_tuple(tup)
ruff3d
PooH
ruff3d
на почту скинул!
Ну как я и предполагал, дело в структуре документа. Внутри нужной вам таблицы есть вложенные и под ваши правила попадают и они тоже. Я немного поигрался с документом, предлагаю парсить так: берем tbody нужной таблицы по id(верстальщику привет, id “nestedView:details:data” - это думали не головным мозгом). И идем по дочерним элементам. Я вот тут накидал, вставку в базу сами прикрутите.
    def print_tuple(t):
        for j, x in enumerate(t):
            print "%d:" % j, x
    doc = html.document_fromstring(open(r).read())
    tbody = doc.cssselect('#"nestedView:details:data">tbody')[0]
    def get_content(td):
        try:
            return td.text_content().strip() or td.cssselect('a')[0].get('href')
        except IndexError:
            return None
    for i, tr in enumerate(tbody):
        tup = tuple(get_content(x) for x in tr)
        print i, "=" * 25
        print_tuple(tup)

СПАСИБО)))
dmugtasimov
Ваша ошибка состоит в том, что Вы зачем-то наращиваете значение переменной i и при этом обращаетесь всегда к первому элементу списка столбцов. Я бы переписал код вот так:
db = MySQLdb.connect(host="localhost", user="root", passwd="111111", db="base", charset='utf8')
if db :
    print "db is ok!"
    cursor = db.cursor()
COLUMNS = ('num', 'name', 'val', 'dom', 'kod', 'sin', 'rar')
SQL = 'INSERT INTO T1 (%s) VALUES (%s)' % (', '.join(COLUMNS), ', '.join('%s' for col in xrange(len(COLUMNS))))
for tr in doc.cssselect('table tr'):
    tds = tr.cssselect('td')
    values = tuple(td.text for td in tds)[:len(COLUMNS)]
    cursor.execute(SQL, values)
Если будет медленно работать, можно делать транзации по 100-1000 инсертов.

P.S.
Код я не отлаживал, имейте ввиду.
odnochlen
cursor.executemany()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB