2013-03-17 2 views
1

Я вижу ответы, где getattr() используется для некоторого простого вызова метода/функции.Как запустить произвольную строку как команду

Как насчет произвольной строки, например. делая паутину синтаксического анализа здесь:

from bs4 import BeautifulSoup 
import urllib 

f = urllib.urlopen(link) # link comes from database, e.g. 'http://www.example.com' 
soup = BeautifulSoup(f) 

text = soup.find(True, 'text').get_text() # Now this is hardcoded 

Работает отлично, но как насчет запуска строки синтаксического анализатора, которая поступает из базы данных? Строка может быть как:

soup.find("div", "layout left").find(id=True).get_text() 

или очень соответствовать чему угодно, зависит от веб-страницы.

ответ

1

Вы можете использовать eval для оценки произвольного выражения Python, хранящегося в строке. Однако это опасно. Хакер или недобросовестный пользователь может вставить вредоносный код в базу данных (например, 1000000**1000000, чтобы заставить Python сходить с ума).

+0

Спасибо, это решение здесь! Должны думать о последствиях, связанных с безопасностью, как вы сказали. – MJo

0

Почему вы не можете перейти от строковой строки, чтобы создать список и сделать что-то вроде этого?

tags = soup.findAll(['div','span']) 

или

soup.findAll(lambda tag: tag.name in ['div', 'span'] or tag['id'] == "eggs") 

или, может быть, даже лучше:

tags = soup.findAll(['div', 'span']) 
tags.extend(soup.findAll(id="eggs")) 

Если вы хотите исключить некоторые теги от состояния вы можете добавить условие лямбда-выражения.

Пример:

Из БД:

s = 'div;span;table' # or something like this with structure 

Делай так:

tags_list = s.split(';') 
tags = soup.findAll(tags_list) 

Я думаю, что вы получили главную идею.

+0

Я не уверен, правильно ли я понял. Но я пытаюсь создать систему, где можно легко (не кодирование как таковое) добавлять новые сайты и настраиваемую строку для синтаксического анализа, все это просто вставляет данные через причудливый пользовательский интерфейс в БД. – MJo

Смежные вопросы