2015-01-13 2 views
0

함수에 전달할 수있는 문자열 안에 키워드가있는 매개 변수 목록을 사용할 수 있는지 알고 싶습니다. 기본적으로 매개 변수 목록에는 키워드가 있거나 없을 수 있으므로 매개 변수 목록에는 '유형'변수가 있습니다. 당신은 키워드 인수 사전에 토큰 목록을 분할해야변수 유형이있는 매개 변수 목록 Python 3?

from bs4 import BeautifulSoup 
import urllib.request as urlreq 
import my_parameters # can have variable values 

# my_parameters.useful_token_concept = ["h1", "class_ = some_class"] 
# I want to pass these above parameters into a function; "class_" is 
# a keyword, but it's wrapped in a string => gives me problems 

url = my_parameters.url 
page = urlreq.urlope(url) 
pageHtml = page.read() 
page.close() 

soup = BeautifulSoup(pageHtml) 
# something like the following line works: 
# params = soup.find("h1", class_ = "some_class") 
params = soup.find(*my_parameters.useful_token_concept) 
# params = soup.find(my_parameters.useful_token_concept[0],\ 
     # my_parameters.useful_token_concept[1]) 

# I don't know how long the list of attributes/parameter-list to 
# BeautifulSoup's find() function will be, nor do I know what keywords, 
# if any, will be passed into find(), as given by a user to my_parameters. 

print(params) # should print the html the user wants to scrape. 

답변

1

및 위치 인수의 목록 : 여기에 내가 할 노력하고있어의 예입니다.

kwargs = {} 
args = [] 
for i in my_parameters.useful_token_concept: 
    bits = i.split('=') 
    if len(bits) > 1: 
     kwargs[bits[0].strip()] = bits[1].strip() 
    else: 
     args.append(bits[0].strip()) 

params = soup.find(*args, **kwargs) 
2

더 나은 표현을 사용하지 않는 이유는 무엇입니까? 즉, 문자열로를 인코딩 한 후 구문 분석하는 것보다 훨씬 간단 대신

my_parameters.useful_token_concept = ["h1", "class_ = some_class"] 

사용

my_parameters.useful_token_concept = ["h1", {"class_": "some_class"}] 

의 이러한 값 '표현이 키워드 매개 변수를 나타 내기 위해 dict를 사용하여, 당신에게 달려 있기 때문에 그 끈 다시!

1

당신은 모든 인수가 전달 될 방법의 문자열 표현을 만들고 실제로 실제 함수 호출에 사용할 수있는 무언가로를 설정하는 eval()을 사용할 수

my_parameters.useful_token_concept = ["h1", "class_ = some_class"] 

def func_proxy(*args, **kwargs): 
    " Just return all positional and keyword arguments. " 
    return args, kwargs 

calling_seq = ', '.join(my_parameters.useful_token_concept) 
args, kwargs = eval('func_proxy({})'.format(calling_seq)) 
print('args:', args)  # -> args: (<Header1 object>,) 
print('kwargs:', kwargs) # -> kwargs: {'class_': <class '__main__.some_class'>} 

parms = soup.find(*args, **kwargs)