Уведомления

Группа в Telegram: @pythonsu

#1 Июль 27, 2012 15:14:39

ruff3d
Зарегистрирован: 2012-05-09
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

импорт данных из HTML таблицы через lxml в MySQL

PooH
Как я понимаю - он выводит несколько строчек, а потом вылетает? Или наоборот до этого выводил несколько строчек, а потом вылетал, а после переделки вылетает сразу. Если так, то возвращаемся к тому, с чего я и начинал - в макете таблиц в строках разное число ячеек. Больше предположений нет, если хотите высылайте мне на почту свой скрипт и пример хтмла, посмотрю.

на почту скинул!

Офлайн

#2 Июль 28, 2012 09:14:51

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

импорт данных из HTML таблицы через lxml в MySQL

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)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Июль 28, 2012 11:05:05

ruff3d
Зарегистрирован: 2012-05-09
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

импорт данных из HTML таблицы через lxml в MySQL

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)

СПАСИБО)))

Офлайн

#4 Июль 29, 2012 23:03:44

dmugtasimov
Зарегистрирован: 2012-07-29
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

импорт данных из HTML таблицы через lxml в MySQL

Ваша ошибка состоит в том, что Вы зачем-то наращиваете значение переменной 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.
Код я не отлаживал, имейте ввиду.

Отредактировано dmugtasimov (Июль 29, 2012 23:11:18)

Офлайн

#5 Июль 30, 2012 16:15:48

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

импорт данных из HTML таблицы через lxml в MySQL

cursor.executemany()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version