TypeError: неподдерживаемый тип(ы) операнда для +: 'Tag' и 'str'

In my following code I am trying to append to every start and end of the value so that I can perform SQL insert operation directly after running my python script.

Following is code

print today,","+ (a['href'] if a else '`NULL`')+",", (a.string if a else 'NULL, NULL')+ "," +",".join(re.findall("'([a-zA-Z0-9,\s]*)'", (a['onclick'] if a else 'NULL, NULL, NULL, NULL, NULL, NULL')))+","+ ", ".join([project] + area),","+pdates+""

Here is my whole code

И вывод я получаю . Надеюсь, я ясно представляю, чего хочу.


person Venkateshwaran Selvaraj    schedule 06.09.2013    source источник
comment
Это было бы намного яснее, если бы вы использовали {}-форматирование или %-форматирование вместо конкатенации строк и print магических запятых. (Во-первых, форматирование автоматически преобразует аргументы в строки, а + — нет.) Что-то вроде этого.   -  person abarnert    schedule 06.09.2013
comment
Кроме того, какой код вы используете? Тот, что выложил здесь, или тот, что у тебя в сути? Можете ли вы обновить либо, чтобы отразить правильную версию?   -  person Phillip Cloud    schedule 06.09.2013
comment
Кроме того, я не уверен, почему вы делаете +"" в конце. Это фактически бессмысленно в Python, и это означает, что вы ожидаете какой-то более слабо типизированный язык, такой как Javascript или PHP, который автоматически преобразует в строку все, что добавляется к строке.   -  person abarnert    schedule 06.09.2013
comment
Наконец, пытаться построить SQL-оператор из подобных частей — всегда плохая идея. Вы получаете проблемы с SQL-инъекциями, цитирование/экранирование ошибок, низкую производительность и сложный код, который трудно отлаживать. . Гораздо лучше использовать заполнители, как объясняется в верхнем разделе sqlite3 документов. .   -  person abarnert    schedule 06.09.2013
comment
Хотел бы я понять, что вы, люди, говорите. Но к сожалению мой опыт работы с самим питоном не более 5 дней   -  person Venkateshwaran Selvaraj    schedule 06.09.2013


Ответы (2)


Проблема в:

(a['href'] if a + '1' else '`NULL`') 

a — экземпляр класса Tag, 1 — строка.

Думаю, вам нужна только проверка if a:

(a['href'] if a else '`NULL`')

И, к сведению, лучше использовать форматирование строк или format вместо объединения строк вручную с помощью +.

И еще лучше использовать параметризованные операторы sql (см. документацию по sqlite3):

query = """
INSERT INTO
    `property`
    (`date`,`Url`,`Rooms`,`place`,`PId`,`Phonenumber1`,`Phonenumber2`,`Phonenumber3`,`Typeofperson`,` Nameofperson`,`typeofproperty`,`Sq.Ft`,`PerSq.Ft`,`AdDate`,`AdYear`)
VALUES
    (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
"""

# define your field values as a list
values = [today, a['href'] if a else 'NULL', ... ]

# execute
cursor.execute(query, values)
person alecxe    schedule 06.09.2013
comment
Да. Я знал проблему. Извините, что я не отправил правильный код в git. Но мне нужно добавить `` к каждому значению в файле .sql, которое я упомянул как вывод - person Venkateshwaran Selvaraj; 06.09.2013
comment
Арг! Я был буквально на полпути к клавише ввода! - person Phillip Cloud; 06.09.2013
comment
@PhillipCloud да, это то, что я обычно говорю, когда отвечает Мартейн :) - person alecxe; 06.09.2013
comment
@alecxe Да Здесь мой фактический код, в котором нет ошибок. ссылка - person Venkateshwaran Selvaraj; 06.09.2013
comment
@Venky В ответе я дал подсказку о том, как вы должны сделать запрос, пожалуйста, проверьте и попробуйте закончить его самостоятельно. - person alecxe; 06.09.2013
comment
Спасибо Алексею. я бы сделал это - person Venkateshwaran Selvaraj; 07.09.2013

Поверните это:

print today,","+ (a['href'] if a else '`NULL`')+",", (a.string if a else 'NULL, NULL')+ "," +",".join(re.findall("'([a-zA-Z0-9,\s]*)'", (a['onclick'] if a else 'NULL, NULL, NULL, NULL, NULL, NULL')))+","+ ", ".join([project] + area),","+pdates+""

в это:

# create your format string
keys = 'date', 'url', 'rooms',  # etc...
fmt_s = ', '.join('{{{key}}}'.format(key=key) for key in keys)
# yields: '{date}, {url}, ...'

# build up the necessary values
params = {'date': today}
params['url'] = a['href'] if a else '`NULL`'
params['rooms'] = a.string if a else 'NULL, NULL'

# etc...

# first format fills in the values from the dict
# second format adds the parens
print("({0})".format(fmt_s.format(**params)))

Ты можешь закончить остальное?

Все же лучше использовать параметризованный SQL, чем создавать строку вручную.

person Phillip Cloud    schedule 06.09.2013