dweiyuan 发表于 2020-3-24 14:56:57

bs4 向find_all()的class_属性传递 方法 时遇到的问题

from bs4 import BeautifulSoup

s = '''
    <ul class="breadcrumb">
      <li>
            <a href="index.html">Home</a>
      </li>
      <li class="active">All products</li>
    </ul>
    '''


soup = BeautifulSoup(s,'lxml')

def sss(css_class) :
    print(css_class)
    return len(css_class)>3
soup.find_all(class_=sss)


我将sss()函数的参数打印了出来,按理说它应该是 tag 的class属性对应的值,但它为None
请问这是为什么?

wp231957 发表于 2020-3-24 15:21:03

你也没调用
也没看明白你想干嘛

dweiyuan 发表于 2020-3-25 17:13:04

wp231957 发表于 2020-3-24 15:21
你也没调用
也没看明白你想干嘛

find_all()方法可以直接传入“方法”的

wp231957 发表于 2020-3-25 17:17:03

dweiyuan 发表于 2020-3-25 17:13
find_all()方法可以直接传入“方法”的

关键是你没有调用啊

Chysial 发表于 2020-3-25 17:48:46

我刚学的,或许对你有用import urllib.request
from bs4 import BeautifulSoup
def url_open(url):
    req = urllib.request.Request(url)
    req.add_header("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36")
    response = urllib.request.urlopen(req)
    html = response.read().decode("gbk")
    return html
def get_url(url):
    html = url_open(url)
    soup = BeautifulSoup(html,"lxml")
    '''print(soup.prettify()) # 格式化代码,自动补全代码
    print(soup.title.string)'#只有标签名,不会有title
    print(soup.title) #有标签名的title
    print(type(soup.title))
    是head标签,如果没有,整个后边的
    print(soup.link)#返回link标签里的选项,但是都是第一个
    #获取标签的名称
    print(soup.title.name)#获取的外层的标签的名称也就是title
    #获取属性 下面两个的内容一样
    print(soup.link.attrs["href"])
    print(soup.link["href"])
    # 获取内容
    print(soup.title.string)
    #嵌套模式
    print(soup.script.src)
    #子节点
    print(soup.header.contents) #返回的是个列表
    print(soup.header.img["src"]) #前边几层都可以.最后一层要用[]的字典形式
    print(soup.ul.li.contents)
    print(soup.ul.li.children)
    for i,child in enumerate(soup.ul.li.children):#返回的是迭代器,用enumerate来得出
      print(i,child)
    #子孙节点
    for i,child in enumerate(soup.ul.li.descendants):#返回的是迭代器,用enumerate来得出
      print(i,child)
    #父节点
    print(soup.ul)
    print("\n"+"i love fishc.com" +"\n")
    for i,child in enumerate(soup.ul.li.parent):
      print(i,child)
    #祖先节点
    print(soup.style)
    print("\n"+"i love fishc.com" +"\n")
    for i,child in enumerate(soup.style.parents):
      print(i,child)
    #兄弟节点
    print(soup.script)
    print("\n"+"i love fishc.com" +"\n")
    print(len(list(enumerate(soup.script.next_siblings))))
    print(list(enumerate(soup.script.previous_siblings)))
    #find_all与urllib类似,可以查找标签名,属性,内容返回的是列表,class bs4
    print(soup.find_all("ul"))
    print("-------------------------------------------------------------------------------------------------")
    print(soup.find_all("ul"))
    for ul in soup.find_all('ul'):
      print(ul.find_all("li"))
      print("-------------------------------------------------------------------------------------------------")
    #attrs是查询字典属性的属性,传入的参数是字典
    print(soup.find_all(attrs = { 'rel':"stylesheet"}))
    print("-------------------------------------------------------------------------------------------------")
    print(soup.find_all(attrs = {'id':"nav_sel"}))
    #也可以直接插class,id等,由于class在python属于关键词,后边要交_,输入的是class_
    print(soup.find_all(rel="stylesheet"))
    print("-------------------------------------------------------------------------------------------------")
    print(soup.find_all(id = "nav_sel"))
    # 根据text进行选择,返回的就是字,并不是条目
    print(soup.find_all(text = "福利"))
    # find方法和fin_dall类似,find返回第一个元素
    print(soup.find("ul"))
    print(type(soup.find('ul')))
    print("-------------------------------------------------------------------------------------------------")
    print(soup.find("page"))
    #其他函数 find_parent()父,子,兄弟,后面的,前面的

    #CSS选择器,使用select()直接传入css选择器
    #选择class时要加一个点,如果存在嵌套关系,两个class之间不需要加任何符号,用一个引号括起来即可,加一个空格;可以选标签; 用id选择,id用#代替 id ="list2"class = element可以用“#list2 .element”,返回的是列表
    print(soup.select('.hot'))
    print("-------------------------------------------------------------------------------------------------")
    print(soup.select(".container .body"))
    print(soup.select("#list2 .element")
    print(soup.select("ul li"))'''
    #select获取属性,[属性名] 或者ul[].attrs["id"],由于返回的是列表,所以要变成字符串输出
    print(soup.link.attrs["href"])
    print(soup.select('link').attrs["href"])
    #get_text获取标签里边的文本,也是列表要加序列号
    for each in soup.select("a"):
      print(each.get_text())
if __name__ == "__main__":
    url = "http://www.quannovel.com/read/11/2588.html"
    get_url(url)

dweiyuan 发表于 2020-3-30 10:47:02

wp231957 发表于 2020-3-25 17:17
关键是你没有调用啊

请问在哪里调用???
页: [1]
查看完整版本: bs4 向find_all()的class_属性传递 方法 时遇到的问题