python爬虫_BeautifulSoup库使用

BeautifulSoup

  1. 概述: BeautifulSoup是一个灵活方便的解析库,处理高效,支持多种解析器,利用它不用编写正则表达式即可方便实现网页信息的提取

解析器

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, “html.parser”) Python的内置标准库执行速度适中文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档 容错能力差
lxml HTML 解析器 BeautifulSoup(markup, “lxml”) 速度快文档容错能力强 需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup, “xml” 速度快唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, “html5lib”) 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 速度慢不依赖外部扩展

BeautifulSoup方法

  1. soup.prettify() 格式化输出
  2. soup.title.sting title标签内容字符串输出
  3. soup.title.text/get_text() title标签内容字符串输出

标签选择器

  1. 选择元素

    html = """
    <html><head><title>Demo</title></head><body><div>
    <p>Hello Python</p>
    <a href="http://www.baidu.com"></a>
    </div>
    </body>
    
    </html>
    """
    
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')
    print(soup.title)      # 如果多个,输出第一个结果
    print(type(soup.head))
    print(soup.p)
    
    输出: 
    <title>Demo</title>
    <class 'bs4.element.Tag'>
    <p>Hello Python</p>
    
  2. 获取名称

    	from bs4 import BeautifulSoup
    	soup = BeautifulSoup(html,'lxml')
    	print(soup.title.name)   # 获取标签名
    	
    	输出:
    	title
    
  3. 获取属性

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')  
    print(soup.p['name'])  # 获取属性名
    
  4. 获取内容

    	from bs4 import BeautifulSoup
    	soup = BeautifulSoup(html,'lxml')
    	print(soup.p.string)     #  获取标签内容
    	print(soup.p.text)     #  获取标签内容
    
  5. 子节点和子孙节点

    	from bs4 import BeautifulSoup
    	soup = BeautifulSoup(html,'lxml')
    	print(soup.body.contents) # 用类表的形式返回子节点
    	
    	
    	from bs4 import BeautifulSoup
    	soup = BeautifulSoup(html,'lxml')
    	print(soup.body.children)
    	for i,child in enumerate(soup.body.children): # 返回索引和子节点
    	    print(i,child)
    
  6. 父节点和祖先节点

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')
    print(soup.span.parent)  # 获取父节点
    print(list(enumerate(soup.span.parents)))  # 获取祖先节点
    
  7. 兄弟节点

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')
    print(list(enumerate(soup.p.next_siblings)))  # 获取后面的兄弟节点
    print(list(enumerate(soup.previous_siblings)))  #  获取前面的兄弟节点
    

标准选择器

find_all(name,attrs,recursive,text,**kwargs) 可根据标签名,属性,内容查找文档(返回所有匹配结果)

  1. name

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')
    # print(soup.find_all('p'))
    # print(soup.find_all('p')[0])
    for p in soup.find_all('p'):
        print(p.find_all('span'))
        print(p.find_all('span')[0].text)
    
  2. attrs

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')
    print(soup.find_all(attrs={'name':'test'}))
    print(soup.find_all(class_='test'))  # class和id有特殊方法
    print(soup.find_all(id='span'))
    
  3. text

    扫描二维码关注公众号,回复: 10556524 查看本文章
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html,'lxml')
    print(soup.find_all(text='123'))   # 只是返回匹配的内容,不返回标签
    

find(name,attrs,recursive,text,**kwargs) 可根据标签名,属性,内容查找文档(返回第一个匹配结果)

CSS选择器

select()直接传入css选择器即可

	from bs4 import BeautifulSoup
	soup = BeautifulSoup(html,'lxml')
	print(soup.select('.test.test2 .test4')) # 类
	print(soup.select('a .test3'))   # 嵌套
	print(soup.select('#span'))   #id
	print(soup.select('p[name]'))  # 属性
	print(soup.select('p[name=test]'))
	```
发布了54 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43388615/article/details/105089071