BeautifulSoup4解析器和CSS选择器

BeautifulSoup4

1,什么是BeautifulSoup4?
和 lxml 一样,Beautiful Soup 也是python的一个HTML/XML的解析器,用它可以方便的从网页中提取数据,Beautiful Soup相比lxml操作起来更简单,但是速度较慢,这也是它的缺点
lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。

BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。
2,怎么使用BeautifulSoup4?
使用 pip 安装即可:pip install beautifulsoup4
安装完成使用:from bs4 import BeautifulSoup导入,下面举例代码说明:

from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

""" #创建 Beautiful Soup 对象 soup = BeautifulSoup(html,'lxml') #打开本地 HTML 文件的方式来创建对象 #soup = BeautifulSoup(open('index.html')) #格式化输出 soup 对象的内容 print(soup.prettify())

我们可以通过soup = BeautifulSoup(html,“lxml”)方式指定lxml解析器,bs4在解析时依赖解析器,
lxml HTML 解析器 BeautifulSoup(markup,‘lxml’) 速度快、文档容错能力强

接下来说下搜索文档树,这里有个find_all()方法,介绍一下它的几个常用参数
name参数:可以根据节点名查询
attrs参数: 可以根据节点属性查询
text参数: 用来匹配节点文本

CSS选择器
这就是另一种与 find_all 方法有异曲同工之妙的查找方法.写 CSS 时,标签名不加任何修饰,类名前加.,id名前加#在这里我们也可以利用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是 list,下面说一下它的表达式,简单列举几个

  • 选择所有节点
    #container 选择id为container的节点

.container 选取所有class包含container的节点

li a 选取所有li下的所有a节点

div#container > ul 选取id为container的div的ul子元素

a[href=“http://jobbole.com”] 选取所有href属性为jobbole.com值的a元素

列举代码说明:
通过标签名查找
soup.select(‘title’)
soup.select(‘b’)

通过类名查找 print soup.select('.sister')
通过 id 名查找 print soup.select('#link1')
组合查找 组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开 print soup.select('p #link1')
还有一个就是直接子标签查找,则使用 > 分隔 print soup.select("head > title")
属性查找
**注意:**查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。

print(soup.select('a[]'))

soup.select('a[href="http://example.com/elsie"]')
同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格

print (soup.select('p a[href="http://example.com/elsie"]'))

获取内容
以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容,attrs[‘属性名’] 获取属性值

soup = BeautifulSoup(html, 'lxml')
print (type(soup.select('title')))
print (soup.select('title')[0].get_text())

for title in soup.select('title'):
print (title.get_text())
print (title.attrs['class'])

你可能感兴趣的:(大神)