Сохранение списка в Python Sqlite3 - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь очистить идентификаторы полей формы, используя Beautiful Soup, как этот

 for link in BeautifulSoup(content, parseOnlyThese=SoupStrainer('input')):
    if link.has_key('id'):
        print link['id']

. Предположим, что он возвращает что-то вроде

username
email
password
passwordagain
terms
button_register

Я хотел бы написать это в Sqlite3DB.

То, что я буду делать в моем приложении, это ... Используйте идентификаторы этих полей формы и попытайтесь выполнить POST.Проблема в том, что есть много таких сайтов, чьи идентификаторы полей формы я вычеркнул.Таким образом, отношение примерно такое ...

Domain1 - First list of Form Fields for this Domain1
Domain2 - Second list of Form Fields for this Domain2
.. and so on

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

COL 1 - Domain URL (as TEXT)
COL 2 - List of Form Field IDs (as TEXT)

Одна вещь, которую нужно запомнить, это ... Внизу в моем приложении мне нужно будет сделать что-то вроде этого ...

Псевдокод

If Domain is "http://somedomain.com":
    For ever item in the COL2 (which is a list of form field ids):
         Assign some set of values to each of the form fields & then make a POST request

Может ли кто-нибудь один руководство, пожалуйста?

РЕДАКТИРОВАНИЕ 22/07/2011 - Является ли моя база данных нижеДизайн правильный?

Я решил найти решение, подобное этому.Что вы, ребята, думаете?

У меня будут три таблицы, как показано ниже

Таблица 1

Key Column (Auto Generated Integer) - Primary Key
Domain as TEXT

Пример данных будет выглядеть примерно так:

1   http://url1.com
2   http://url2.com
3   http://url3.com

Таблица 2

Domain (Here I will be using the Key Number from Table 1)
RegLink - This will have the registeration link (as TEXT)
Form Fields (as Text)

Пример данных будет выглядеть примерно так:

1   http://url1.com/register    field1
1   http://url1.com/register    field2
1   http://url1.com/register    field3
2   http://url2.com/register    field1
2   http://url2.com/register    field2
2   http://url2.com/register    field3
3   http://url3.com/register    field1
3   http://url3.com/register    field2
3   http://url3.com/register    field3

Таблица 3

Domain (Here I will be using the Key Number from Table 1)
Status (as TEXT)
User (as TEXT)
Pass (as TEXT)

Пример данных будет выглядеть примерно так:

1   Pass    user1   pass1
2   Fail    user2   pass2
3   Pass    user3   pass3

Как вы думаете, этот дизайн таблицы хорош?Или есть какие-то улучшения, которые можно сделать?

Ответы [ 3 ]

1 голос
/ 21 июля 2011

Правильный дизайн базы данных предполагает, что у вас есть таблица URL-адресов и таблица полей, каждое из которых ссылается на запись URL-адреса. Но в зависимости от того, что вы хотите с ними сделать, вы можете упаковать списки в один столбец. См. документы о том, как это сделать .

Требуется ли sqlite? Возможно, это не лучший способ хранения данных. Например. если вам нужен поиск с произвольным доступом по URL, лучше подойдет модуль полки . Если вам просто нужно записать их и выполнить итерации по сайтам, может быть проще сохранить их как CSV.

1 голос
/ 21 июля 2011

В вашей таблице проблема нормализации.

Использование 2 таблиц с

TABLE domains
int id primary key
text name

TABLE field_ids
int id primary key
int domain_id foreign key ref domains
text value

- лучшее решение.

0 голосов
/ 21 июля 2011

Попробуйте получить идентификаторы:

ids = (link['id'] for link in
        BeautifulSoup(content, parseOnlyThese=SoupStrainer('input')) 
         if link.has_key('id'))

И это должно показать вам, как их сохранить, загрузить и что-то сделать для каждого. При этом используется одна таблица и просто вставляется одна строка для каждого поля для каждого домена. Это самое простое решение, и оно идеально подходит для относительно небольшого количества строк данных.

from itertools import izip, repeat
import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''create table domains
(domain text, linkid text)''')

domain_to_insert = 'domain_name'
ids = ['id1', 'id2']
c.executemany("""insert into domains
      values (?, ?)""", izip(repeat(domain_to_insert), ids))
conn.commit()

domain_to_select = 'domain_name'
c.execute("""select * from domains where domain=?""", (domain_to_select,))

# this is just an example
def some_function_of_row(row):
    return row[1] + ' value'

fields = dict((row[1], some_function_of_row(row)) for row in c)
print fields
c.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...