Python 如何将动态css选择器用于Beautiful Soup?

Python 如何将动态css选择器用于Beautiful Soup?,python,dynamic,beautifulsoup,exec,Python,Dynamic,Beautifulsoup,Exec,下面的代码从siteUrlArray中的站点的特定选择器中刮取数据。它很好用 然而,这需要我为每个网站编写一个函数——只是为了定义选择器。我尝试动态地构建 soup.find和soup.select使用exec和dict来保存选择器变量-但我无法让它工作 工作代码 从bs4导入BeautifulSoup 导入请求 导入系统 进口tldextract def ProcessMarketBeat汤: 尝试: mbtSel=soup.findAlldiv,{id:cphprimary内容\选项卡分析}

下面的代码从siteUrlArray中的站点的特定选择器中刮取数据。它很好用

然而,这需要我为每个网站编写一个函数——只是为了定义选择器。我尝试动态地构建 soup.find和soup.select使用exec和dict来保存选择器变量-但我无法让它工作

工作代码

从bs4导入BeautifulSoup 导入请求 导入系统 进口tldextract def ProcessMarketBeat汤: 尝试: mbtSel=soup.findAlldiv,{id:cphprimary内容\选项卡分析}[0]。findtable 印刷体 例外情况除外,如e: 印刷厂 def processwsjsoup: 尝试: wsjSel=soup.select'.at8-col4>.zoneModule'[0] printwsjSel 例外情况除外,如e: 印刷厂 全局站点URL、域、头、解析器 header={'user-agent':'Mozilla/5.0 Macintosh;Intel Mac OS X 10.9;rv:32.0 Gecko/20100101 Firefox/32.0',} 解析器='html.parser' siteUrlArray=['http://www.marketbeat.com/stocks/NASDAQ/GOOGL/price-target', 'http://www.wsj.com/market-data/quotes/GOOGL/research-ratings', 'http://www.marketbeat.com/stocks/NASDAQ/SQ/price-target', 'http://www.wsj.com/market-data/quotes/SQ/research-ratings'] 对于rangelensiteUrlArray中的i: siteUrl=siteUrlArray[i] parsedUrl=tldextract.extractsiteUrl domain=parsedUrl.domain r=requests.getsiteUrl,headers=header,verify=False soup=BeautifulSoupr.text,解析器 getattrsys.modules[\u__;name\u_;],进程%s%domainsoup 尝试使用动态选择器

斯托克迪克特={ 'marketbeat':'x=soup.findAlldiv,{id:cphPrimaryContent\u tabAnalystRatings}[0]。findtable', “wsj”:“x=soup.select.at8-col4>.zoneModule[0]” } header={'user-agent':'Mozilla/5.0 Macintosh;Intel Mac OS X 10.9;rv:32.0 Gecko/20100101 Firefox/32.0',} 解析器='html.parser' siteUrlArray=['http://www.marketbeat.com/stocks/NASDAQ/GOOGL/price-target', 'http://www.wsj.com/market-data/quotes/GOOGL/research-ratings', 'http://www.marketbeat.com/stocks/NASDAQ/SQ/price-target', 'http://www.wsj.com/market-data/quotes/SQ/research-ratings'] 对于rangelensiteUrlArray中的i: siteUrl=siteUrlArray[i] parsedUrl=tldextract.extractsiteUrl domain=parsedUrl.domain r=requests.getsiteUrl,headers=header,verify=False soup=BeautifulSoupr.text,解析器 选择器=stockDict.getdomain 执行选择器 我想让执行官运行与 x=soup.findAlldiv,{id:cphprimary内容\选项卡分析}[0]。findtable 这样我就可以把标签打印成printx printx
但是x打印为None,而不是所选对象的HTML代码。

我能够用以下代码实现我的目标:

selectorDict = {
    'marketbeat': 'x = soup.findAll("div", {"id": "cphPrimaryContent_tabAnalystRatings"})[0].find("table")\nprint(x)',
    'wsj': 'x = soup.select(".at8-col4 > .zonedModule")[0]\nprint(x)'
}

for i in range(len(siteUrlArray)):
    siteUrl = siteUrlArray[i]   
    print(siteUrl)
    parsedUrl = tldextract.extract(siteUrl)
    domain = parsedUrl.domain

    r = requests.get(siteUrl, headers=header, verify=False)
    soup = BeautifulSoup(r.text, parser)

    selector = selectorDict.get(domain)
    try:
        exec(selector) 
    except Exception as e:
        print(str(e))        

当我运行您的代码时,第26行中的tldextract没有定义。谢谢您的消息@DavidMedinets。我想我找到了一种方法来实现我的目标-我正在分享下面的代码。您可以接受自己的答案。