爬虫笔记之BeautifulSoup模块官方文档笔记

                            爬虫笔记之BeautifulSoup模块官方文档笔记

文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍

几个简单浏览结构化数据的方法:

soup.title

soup.title.name

soup.title.string

soup.title.parent.name//上层标签

soup.p

soup.p[‘class’]

soup.a

soup.find_all(‘a’)//得到所有完整a标签

for link in soup.find_all(‘a’):

       print(link.get(‘href”))//得到a标签内部的href

soup.get_text()//得到文档中所有文字的内容

 

 

Beautiful Soup支持中的解析器:

1.Python   BeautifulSoup(markup,”html.parser”)

2.lxml HTML解析器    BeautifulSoup(markup,”lxml”)

3.lxml XML 解析器   BeautifulSoup(markup,”xml”)

                     BeautifulSoup(markup,[“lxml-xml”])

4.html5lib           BeautifulSoup(markup,”html5lib”)

推荐使用lxml解析器,效率更高

 

 

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4Tag , NavigableString , BeautifulSoup , Comment .

Tag

 tag的属性操作方法与字典一样 

 

1.name属性:

tag.name

2.attributes属性:

tag.attrs//输出字

tag[‘class’]

3.属性

Beautiful Soup中多属性的返回型是list

 

NavigableString

Beautiful Soup NavigableString 类来包装tag中的字符串

 unicode() 方法可以直接将 NavigableString 对象转换成Unicode字符串:

type(tag.string)//navigablestring类型

unicode_string = unicode(tag.string)

tag中包含的字符串不能编辑,但是可以被替成其它的字符串, replace_with() 方法:

如果想在Beautiful Soup之外使用 NavigableString 对象,需要调用 unicode() 方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.

BeautifulSoup

对象表示的是一个文档的全部内容.大部分,可以把它当作 Tag 

Comment

表示文档的注部分是一个特殊型的 NavigableString 对象:

 

 

文档

注意: Beautiful Soup中字符串点不支持些属性,字符串没有子节点

点取属性的方式只能得当前名字的第一个tag

 

tag .contents 属性可以将tag的子点以列表的方式:

支持.contents[0]形式

字符串没有 .contents 属性,字符串没有子:

tag .children 生成器,可以tag的子行循:

for child in title_tag.children:
    print(child)

.contents  .children 属性包含tag的直接子.

.descendants 属性可以所有tag的子孙节递归

如果tag只有一个 NavigableString 类型子节点,那么tag可以使用 .string 得到子

如果一个tag仅有一个子节点,那么tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同:如果tag包含了多个子,tag就无法确定 .string 方法应该调用哪个子点的内容.string 果是 None :

 

如果tag中包含多个字符串 ,可以使用 .strings 来循环获:

 .parent 属性来取某个元素的父.

元素的 .parents 属性可以递归得到元素的所有父辈节

使用 .next_sibling  .previous_sibling 属性来查询兄弟:

 

搜索文档

find()  find_all() 

1.字符串

soup.find_all('b')//查找所有B标签

2.正表达式

for tag in soup.find_all(re.compile("t"))://所有名字当中带t字母的标签
    print(tag.name)
for tag in soup.find_all(re.compile("^b"))://所有名字以b开头的标签
    print(tag.name)

3.列表

soup.find_all(["a", "b"])//分别查找所有的a b 标签,运用了字符串那一类

 

CSS搜索

soup.find_all("a", class_="sister")
soup.find_all("p", class_="body strikeout")

find_all("p", "title") 返回的是CSS Class”title”<p>标签

 

 string 参数可以搜搜文档中的字符串内容. name 参数的可选值string 参数接受 字符串 表达式 列表True .

soup.find_all(string="Elsie")
soup.find_all(string=["Tillie", "Elsie", "Lacie"])
soup.find_all(string=re.compile("Dormouse"))

调用tag find_all() 方法,Beautiful Soup索当前tag的所有子孙节,如果只想搜索tag的直接子,可以使用参数 recursive=False .

soup.html.find_all("title", recursive=False)
 
soup.find_all('title', limit=1) 等价于 soup.find('title')

 limit 参数限制返回果的数量只找近的一个

 

 .select() 方法

 Tag  BeautifulSoup 对象的 .select() 方法中传入字符串参数即可使用CSS选择器的语法找到tagtag标签逐层查找:

soup.select("body a")
soup.select("html head title")

直接子标签

soup.select("p > a")

兄弟标签:

soup.select("#link1 ~ .sister")

tagid

soup.select("#link1")

CSS

soup.select(".sister")

 

soup.select("[class~=sister]")
soup.get_text("|")//分隔符

 

编码

 

任何HTMLXML文档都有自己的编码方式,比如ASCII UTF-8,但是使用Beautiful Soup解析后,文档都被转换成了Unicode:

过传 from_encoding 参数来指定编码方式:

soup = BeautifulSoup(markup, from_encoding="iso-8859-8")

. (exclude_encodings 参数是4.4.0版本的新功能)排除这样文档就不会尝试使用这种编码了解码

两个 NavigableString  Tag 对象具有相同的HTMLXML结构时, Beautiful Soup就判断两个象相同.

如果想判断两个象是否格的指向同一个象可以通 is 来判断

copy.copy() 方法可以复制任意 Tag  NavigableString 

import copy
p_copy = copy.copy(soup.p)

 

解析部分文档

如果仅仅想要找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉SoupStrainer 类可以定义文档的某段内容,这样搜索文档时就不必先解析整篇文档,只会解析在 SoupStrainer 中定义过的文档创建一个 SoupStrainer 对象并作为 parse_only 参数 BeautifulSoup 的构造方法即可.

from bs4 import SoupStrainer
1.only_a_tags = SoupStrainer("a")
2.only_tags_with_id_link2 = SoupStrainer(id="link2")
3.def is_short_string(string):
      return len(string) < 10
  only_short_strings = SoupStrainer(string=is_short_string)

print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify())

#参数一为解析的内容,参数二为指定解析器
print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify())
print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify())

 

默认情况下,Beautiful Soup会将当前文档作为HTML格式解析,如果要解析XML文档,要在 BeautifulSoup 构造方法中加入第二个参数“xml”:

soup = BeautifulSoup(markup, "xml")

当然,还需要 安装lxml

 

还有提高Beautiful Soup效率的,使用lxml解析器.Beautiful Souplxml做解析器比用html5libPython内置解析器速度快很多.

加油吧,程序员!

猜你喜欢

转载自blog.csdn.net/weixin_42248302/article/details/83411582