传递函数作为参数 - BeautifulSoup

时间:2017-04-06 08:32:06

标签: python beautifulsoup

在BeautifulSoup文档中,函数定义如下:

def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')

然后作为参数传递给函数:find_all()

soup.find_all(has_class_but_no_id)

让我感到惊讶的是它起作用了。我真的不知道机制在这里是如何工作的,这个函数(has_class_but_no_id)如何在没有参数的情况下返回find_all()函数的值?

1 个答案:

答案 0 :(得分:1)

将{P} has_class_but_no_id传递给find_all()时,

find_all没有执行。

has_class_but_no_id多次执行对def say_something(something_to_say): print something_to_say def call_another_function(func, argument): func(argument) call_another_function(say_something, "hi there") 的调用,并在此时将标记作为'tag'的值传递。这种模式利用了这样一个事实:在Python中,函数就是所谓的一阶对象 - 它们作为对象存在,你可以在变量中传递它们。

这允许函数接受其他函数并在以后运行它们 - 就像BeautifulSoup在这里一样。

尝试实验:

VBox vertikalBox = new VBox();
try (Scanner s = new Scanner("rebricek.txt")) {
        while (s.hasNext()) {
            //InputMismatchException 
            vertikalBox.getChildren().addAll(new Label(""+ s.nextInt() + " " + s.next() + " " + s.nextInt()));
            s.nextLine();
        }


    } catch (Throwable t) {
        // inputmismatchexception - PROBLEM
        // this is for NoSuchElementException
        System.err.println("Vyskytla sa chyba pri praci zo suborom");
    }

上述答案取自this Reddit post

此外,请参阅source code for find_allcall