Python

[Python] BeautifulSoup使用

2020-04-09  本文已影响0人  半为花间酒

内容参考:4.2-使用Beautiful Soup(崔庆才)

内容是以前的学习笔记,内容不全,主观性较大,欢迎参考

解析器

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_data,'lxml') #解析器中'lxml'快,'html.parser'内置较快
print(soup.prettify())  # 整理成清晰标准的文档树,遗失的根元素会补齐并转小写

find() / find_all()

find_all(self,name=None,attrs={},recursive=True,text=None,limit=None,**kwargs)

  1. name: 要查找的tag标签名称,默认为None,即查找所有元素

    tag = soup.find('p')

  2. attrs: 查找含有指定属性的元素,字典形式

    tag = soup.find_all('p',attrs={'class':'title'})

    也可以不用字典形式直接传入

    tag = soup.find(class_ = 'title')

  3. recursive: 是否在元素节点子树下全范围查找,默认是True

tips:

text = "<div class = 'style xxx'>"

tag = soup.find('div')  # 也可写作 tag = soup.div
tag['class'] == ['style','xxx']

自定义函数高级查找

def myFilter(tag)
    results = tag.name=='a' and tag.has_attr['href'] and tag['href']==''
    return results

soup = BeautifulSoup(html_data,'lxml')
tag = soup.find_all(myFilter)
print(tag)

CSS选择器

tag.select(CSS)

返回的是bs4.element.Tag的列表

属性的语法规则:

选择器 描述
[attrs ^= value] 匹配属性值以指定值开头的每个元素
[attrs $= value] 匹配属性值以指定值结尾的每个元素
[attrs *= value] 匹配属性值中包含指定值的每个元素

遍历HTML树

tag = soup.find('p')
while tag:
    print(tag.name)
    tag = tag.parent
tag = soup.find('p')
for x in tag.children:
    print(x.name)
tag = soup.find('p')
for x in tag.desendants:
    print(x)  # 子孙节点包括text等
  1. 前一个兄弟节点:

tag.previous_sibling

  1. 后一个兄弟节点:

tag.next_sibling

UnicodeDammit()

属于bs4库,用于识别response文本的编码并转换

from bs4 import UnicodeDammit

Dammit = UnicodeDammit(data,['utf-8','gbk']) # 识别
data = Dammit.unicode_markup # 转换

可用下列代码识别编码

from bs4 import BeautifulSoup
import urllib.request

content = urllib.request.urlopen(url)
soup = BeautifulSoup(content)
print(soup.original_encoding)
# > utf-8
上一篇下一篇

猜你喜欢

热点阅读