python中的BeautifulSoup使用小结

1.安装

pip install beautifulsoup4

2.代码文件中导入

from bs4 import BeautifulSoup

3.

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

4.

r = requests.get(‘http://www.baidu.com/‘)
soup = BeautifulSoup(r.text, ‘html.parser‘)

soup = BeautifulSoup(open(‘index.html‘))

print soup.prettify()  #美化HTML代码显示

5.

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象:

soup.head
soup.a
#显示第一个同名标签
soup.head.name #显示标签名称,这里输出‘head’
soup.head.attrs  #显示标签的属性,以字典形式返回所有属性
soup.head[‘class‘] #显示head标签的class属性值
soup.head[‘class‘] = ‘newclass‘ #修改head标签class属性值为‘newclass’
del soup.head[‘class‘] #删除head标签的class属性
soup.head.string  #获取标签内的正文内容,返回值类型为NavigableString

6.遍历

soup.body.contents[0]  #获取body标签的第一个子结点,contents是一个列表
for child in soup.body.children:
    print(child.string)     #children与contents一样,都获取全部直接子结点,只不过children是一个生成器,需遍历取出

for child in soup.body.descendants:
    print(child.string)    #递归遍历获取自身下面所有层级的所有节点,从最高一层列出然后下一层,直到最底层。

for string in soup.body.children.strings:
    print(repr(string))    #strings获取多个正文内容,需遍历取出,stripped_strings去掉每个字符串前后空格及空行,多余的空格或空行全部去掉,使用方法与strings一致

soup.body.parent #获取父节点
for parent in soup.head.title.string.parents:
    print(parent.name)    #遍历上级节点路径,返回结果为title,head,html

.next_sibling   #下一兄弟节点
.previous_sibling  #上一兄弟节点
.next_siblings  #往下遍历所有兄弟节点
.previous_siblings  #往上遍历所有兄弟节点
.next_element    #下一节点,不分层级
.previous_element    #上一节点,不分层级
.next_elements     #往下顺序遍历所有节点,不分层级
.previous_elements   #往上遍历所有节点,不分层级

7.搜索查找标签

find_all( name , attrs , recursive , text , **kwargs )
#例:
#(1)name参数
soup.find_all(‘a‘)  #查找所有a标签
soup.body.div.find_all(‘a‘)  #查找body下面第一个div中的所有a标签

for tag in soup.find_all(re.compile(‘^b‘));
    print(tag.name)      #正则表达式查找所有以b开头的标签

soup.find_all([‘a‘,‘b‘])  #列表查找,返回所有a标签和b标签

soup.find_all(True)    #为True时,所有标签都满足搜索条件,返回所有标签

#以下为自定义过滤条件,筛选满足自定义条件的标签
def has_class_but_no_id(tag):
    return tag.has_attr(‘class‘) and not tag.has_attr(‘id‘)
soup.find_all(has_class_but_no_id)  #返回所有具有class属性但无id属性的标签

#(2)attrs参数,以标签属性搜索
soup.find_all(id=‘nd2‘) #返回所有标签中属性id等于nd2的标签
soup.find_all(href=re.compile("elsie"), id=‘link1‘)  #多个条件同时筛选,可用正则表达式
soup.find_all("a", class_="sister") #属性中如果有python关键字,比如class属性,不可以直接class=‘sister‘,应加个下划线与python关键字区分class_=‘sister‘
soup.find_all(attrs={"data-foo": "value"})
#类似于html5中的data-foo属性不可直接写为soup.find_all(data-foo=‘value‘),因为python命名规则中不允许有中划线(即横杠),应以字典形式传入attrs参数中,所有的属性搜索都可以使用这种方法

#(3)text参数
soup.find_all(text="Tillie") #搜索文档中的字符串内容为tillie,与name参数一样,可用列表、正则表达式等

#(4)limit参数
soup.find_all(‘a‘, limit=2) #返回搜索文档中前两个a标签,文档较大时可节约资源

#(5)recursive参数
soup.head.find_all("title", recursive=False)
#在head的直接子节点中搜索,默认为recursive=True,表示在所有子孙节点中搜索
find( name , attrs , recursive , text , **kwargs )
#与find_all用法完全一致,区别在于find只返回第一个满足条件的结果,而find_all返回的是一个列表,需遍历操作
#以下方法参数用法与 find_all() 完全相同,下面只列出区别

find_parents()  find_parent()
#find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等. find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档搜索文档包含的内容

find_next_siblings()  find_next_sibling()
#这2个方法通过 .next_siblings 属性对当 tag 的所有后面解析的兄弟 tag 节点进行迭代, find_next_siblings() 方法返回所有符合条件的后面的兄弟节点,find_next_sibling() 只返回符合条件的后面的第一个tag节点

find_previous_siblings()  find_previous_sibling()
#这2个方法通过 .previous_siblings 属性对当前 tag 的前面解析的兄弟 tag 节点进行迭代, find_previous_siblings() 方法返回所有符合条件的前面的兄弟节点, find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点

find_all_next()  find_next()
#这2个方法通过 .next_elements 属性对当前 tag 的之后的 tag 和字符串进行迭代, find_all_next() 方法返回所有符合条件的节点, find_next() 方法返回第一个符合条件的节点

find_all_previous() 和 find_previous()
#这2个方法通过 .previous_elements 属性对当前节点前面的 tag 和字符串进行迭代, find_all_previous() 方法返回所有符合条件的节点, find_previous()方法返回第一个符合条件的节点
时间: 2024-08-08 16:22:38

python中的BeautifulSoup使用小结的相关文章

python中的random模块小结

目录 python中的random模块总结 调用 random.random() random.uniform(a, b) random.randint(a, b) random.randrange([start=0], stop, [step=1]) random.choice(sequence) random.shuffle(x, [random]) random.sample(sequence, k) python中的random模块总结 调用 import random # python

python中的变量引用小结

python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(immutable)对象 strings, tuples, 和numbers是不可更改的对象 list,dict等则是可以修改的对象. 如果某个变量指向不可更改的对象,则重新赋值时.原对象被抛弃,变量会指向一个新对象. 若指向的是可更改的对象,则重新赋值时,会也会重新赋值内存中对象的值. 如图:nfo

python中的requests使用小结

现接触到的很少,详细的官方教程地址: requests官方指南文档:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html requests高级指南文档:http://docs.python-requests.org/zh_CN/latest/user/advanced.html#advanced 1.安装request,bs4 pip install requests pip install bs4 2.代码文档中调用

python中的try/except/else/finally语句--自我小结

def main():      try:        print "try"        return True    except:        print "except"    finally:        print "finally"        print "main" 输出: try finally 就算try中有return语句,最终的finally也会被执行. 其他人的一些好的总结: http:/

Python中xPath技术和BeautifulSoup的使用

xpath基本知识 XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集 路径表达式 nodename:表示选取此节点的所有子节点 /    : 表示从根节点选取 //   :选择任意位置的某个节点.            .  :选取当前节点           ..   :选取当前节点的父节点 @   :选取属性    谓语实例 实现效果                                                                 路劲表

python中的字典内置方法小结

#!/usr/local/bin/python3 # -*- coding:utf-8 -*- #key-value #dict 无序,无下标,不需要下标,因为有key stu={ 'stu001':"zhang yu", 'stu002':"ma hong yan", 'stu003':"zhang guo bin", 'stu004':"sha chun hua" } ''' -----------------------

快速入门Python中文件读写IO是如何来操作外部数据的?

读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件). 读文件 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符 >>> f =

Python中定义字符串和修改字符串的原理

   Python是用C语言开发的,在C语言中是没有字符串的概念,只有字符和字符数组,一般用字符数组表示字符串,所以在Python中定义一个字符串时,其实就是在内存中开辟一块空间, 例如: 定义一个字 符串string1=hello  --------->5个字符 字符数组['h','e','l','l','o'],其在内存中存储的位置为:['h','e','l','l','o'] 而如果想要修改该字符串为hellosb,在需要在内存中重新开辟一块数据空间为:['h','e','l','l','

Python中有关赋值的奇怪现象

下面看两个例子: 1) 2) 看到区别了吧~~ 在第1)个例子中a的值改变不影响b的值:而在2)例子中L1的值改变了会影响L2的值. 其实并不难理解,再看第3)个例子: 小结:如果是对整个变量重新赋值,则这个变量指向原来数值的指针会断掉,转而指向新的值:而如果只是对变量里面的一部分重新赋值(改变),则只不会断掉指针,这时改变的就是内存中的数值,其他指向这个数值的输出结果也会改变. Python中有关赋值的奇怪现象,布布扣,bubuko.com