我看到了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()
或非常匹配任何东西,取决于网页。
答案 0 :(得分:1)
您可以使用eval
来评估存储在字符串中的任意Python表达式。但是,这很危险。黑客或不道德的用户可能会将恶意代码插入数据库(例如1000000**1000000
,导致Python疯狂)。
答案 1 :(得分: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"))
如果要按条件排除某些标记,可以将条件添加到lambda表达式。
示例:强>
来自DB:
s = 'div;span;table' # or something like this with structure
这样做:
tags_list = s.split(';')
tags = soup.findAll(tags_list)
我认为你有主要想法。