2013-03-17 44 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 2013-03-31 19:31:42

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) 

我觉得你有主要的想法。

+0

我不确定我是否理解正确..但我试图让系统在哪里可以很容易(不是编码本身)添加新的网站和量身定制的字符串解析,所有这些只是通过花哨的UI插入数据到数据库。 – MJo 2013-03-31 19:34:14

相关问题