【问题标题】:Parameter passing in function参数传入函数
【发布时间】:2022-01-20 23:31:39
【问题描述】:

在 Python 出现的这些年里,似乎已经解决了这个问题,但不管怎样:

def soupstrainer(tag_element,srch_str):
    ''' take a soup element
        return a list of found items
    '''
    results=[]
    ###literal search string returns results, even though two lines down,
    ### print(srch_str) returns the expected string
    souper=tag_element.find_all('a',{'data-tn-element':'companyName'}) #srch_str)
    print(srch_str)
    for r in souper:
        if r != None:
            results.append(r.get_text(r.string, strip=True))
    return results

with open('scrapesnip.html', 'r') as the_file:
    doc4 = the_file.read()

soup = BeautifulSoup(doc4, 'html.parser')
result = soupstrainer(soup,str("'a',{'data-tn-element':'companyName'}"))
print(result,len(result))

结果:

## zero results passing the string
/PYscripts/bravosierra4.py
'a',{'data-tn-element':'companyName'}        <=== these two strings *look* identical
[] 0

## with the identical string
## 'hard coded' into the function
/PYscripts/bravosierra4.py
'a',{'data-tn-element':'companyName'}         <=== these two strings *look identical
['Keysight Technologies', 'ECS Federal LLC', 'Corsica Technologies, LLC', 'Caribou', 'Collins Aerospace', 'Travelers', 'CyberCoders', 'HealthVerity', 'Circadence Corporation'] 9

我是否错误地传递了srch_string

【问题讨论】:

  • 上面共享的代码和输出的完全混乱使得很难对你的问题说任何明智的 - 我觉得编译器可能会有同样的感觉。请澄清问题,分享一些人们可以运行以重现问题的代码,并解释您的预期以及发生了什么。
  • 你正在传递两个完全不同的东西!
  • 还不错,我也觉得很乱!我将尝试提炼: 1. 函数 soupstrainer 有两个参数,HTML glob tag_element 和我希望从 glob 中过滤出来的内容,即 search_str。
  • 2. @juanpa.arrivillaga,我想我只传递了一个字符串类型的对象。但我必须以函数不期望的方式传递,我在 find_all 下面的行中使用 print(srch_str),它似乎与我将它粘贴到函数中时工作的字符串相同(硬-代码)。
  • souper=tag_element.find_all('a',{'data-tn-element':'companyName'}) 没有传入字符串!那是两个不同的参数,一个是字符串,另一个是字典。 "'a',{'data-tn-element':'companyName'}" 是一个字符串。看看下面的答案

标签: python function beautifulsoup parameters


【解决方案1】:

我不确定你到底是如何传递srch_string,但是这个:

souper = tag_element.find_all('a', {'data-tn-element': 'companyName'})

和这个不一样:

srch_string = "'a', {'data-tn-element': 'companyName'}"
souper = tag_element.find_all(srch_string)

在第一种情况下,您将一个字符串和一个字典作为单独的参数传递。在第二种情况下,您传递的是单个字符串。您放入字符串变量的代码不会被评估为其他表达式中的代码(如果这样做将是一个非常大的问题)。

你可以这样做:

def soupstrainer(tag_element, *srch_args):
    """take a soup element and search args, return a list of found items"""
    souper = tag_element.find_all(*srch_args)
    return [r.get_text(r.string, strip=True) for r in souper if r is not None]

...
result = soupstrainer(soup, ,'a', {'data-tn-element': 'companyName'})

这样soupstrainer 只需将搜索参数作为单独的参数(而不是将它们打包成单个字符串)并将它们直接传递给find_all

【讨论】:

    【解决方案2】:

    看起来 BeautifulSoup 将 find_all 解析为自然列表,因此当它显示为字符串时,不会返回任何内容。这是我成功编写调用函数的行的方式:

    result = soupstrainer(soup,['a',{'data-tn-element':'companyName'}])
    

    并像这样重新编码函数:

    def soupstrainer(tag_element,srch_str):
        ''' take a soup element 
            return a list of found items
        '''
        results=[]
        souper=tag_element.find_all(srch_str[0],srch_str[1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 2012-07-16
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多