beautifulsoup4
灵活又方便的网页解析库, 处理高效, 支持多种解析器. 利用它不用编写正则表达式即可方便地实现网页的提取.
使用方法:
案例代码展示可不看
- import requests
- from bs4 import *
- import re
- urls='https://www.dbmeinv.com/' #这是一个 urls 地址
- res=requests.get(urls) #获取网页内容
- t=res.text #网页 内容以文本形式赋值给 t
- # 匹配图片地址的正则
- # needs=r'https://wx.*?jpg'
- # pattern = re.compile(needs)
- # need= pattern.findall(t)
- # 获取标签内容和图片的地址的代码
- soup = BeautifulSoup(t,'lxml') # 解析器为 lxml
- list_img=soup.find('img') #寻找所有的 img 标签
- print(type(list_img[0])) #获取 src 属性即 图片的唯一地址
- print(list_img[0].get('src'))
- for img_src in list_img:
- print(img_src.get('src')) #遍历图片的地址
- list_url=soup.find_all('a') #寻找所有的 a 标签
- print(type(list_url[0]))
- print(list_url[0].get('href'))
- for img_url in list_img:
- print(img_url.get_text()) #获取 a 标签中的文本内容
- soup=BeautifulSoup(t,'html.parser')
- print(soup.find_all('a',class_='sister'))#class 是特殊属性, 因为 class 是关键字
- print(soup.find_all('a',id='link3'))# 用于查找有特定属性的标签
- sibling_soup = BeautifulSoup("<a><b id='bbb'>text1</b><b>text2</b></b></a>", 'html.parser')
- print(sibling_soup)
- print(sibling_soup.find('b',id='bbb')) #获取 id 为 bbb 的标签
- print(sibling_soup.find('b',id='bbb').next_sibling) #获取 id 为 bbb 的标签的下一个 b 标签
- ****
使用 BeatuifulSoup
引用 BeatuifulSoup
最常用的引用方式
Ps:B S 需要大写
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup("<p>data</p>",'html.parser')
- # 两个参数 一个是需要解析的内容 一个是解析器
- Soup=BeautifulSoup( open(path,"html.parser"))
BeatuifulSoup 基本元素
标签的认识可以参考 HTML
属性的应用
Demo 是一个 respose.text
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Print(Soup.title)
- # 打印出页面的 title 包含闭合标签的内容
- Tag=soup.a
- Print(Tag)# 打印 a 标签的内容包括各种属性
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Soup.a.name #获取 a 标签的名字
- Soup.a.parent.name #霸霸
- Soup.a.parent.parent.name #霸霸的霸霸
- # 对于一个标签可以使用. name 的方式获得他的名字 返回的是一个字符串形式
- Tag=soup.a
- Print(Tag.attrs)
- # 返回标签的属性 是一个字典格式
- # 对信息的提取
- Tag.attrs['class'] #获取 class 的值
- Tag.attrs["href"]# 获取 href 属性
- #Tag 的类型 是一个 bs4 种的一个内置类型
- Soup.a.string #a 标签内容的属性
- # 可以跨越多个标签层次即: 无视标签内容含有的标签
当标签内容中含有注释的时候
Soup.b.string 会正常打印标签内容无视注释效果
可通过类型判断
- Print(type("Soup.b.string"))
- Print(type("Soup.b.string"))
- # 基于 bs4 库中的 htm 库的遍历方法
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
Print(Soup.head) 获取 head 标签
- print(Soup.head.contents) #head 标签中的儿子标签是 title 标签
- # 返回的内容是一个列表
- print(Soup.body.contents)# 获取 body 的儿子标签
- Print(len(Soup.body.contents)) #获取 body 标签的儿子标签的数量
Ps: 子节点不知包括标签 甚至一些'\n'之类的换行符都可以是子节点
可通过列表类型的下表来检索其中的内容
- Soup.body.contents[1] #获取第二个元素
- # 也可以通过 for 循环遍历
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Print(Soup.title.parent) #打印出 title 标签的霸霸
- print(Soup.HTML.parent)#HTML 标签是 doc 中的最高级标签他的霸霸是他自己包含其中自己的全部内容
- print(Soup.parent)#soup 本身没有霸霸
这里插入一个方法
- Soup.prettify()
- # 这个方法就是在每个标签后加入一个 \ n
打印出来是十分规范的 h5 代码 一目了然
也可以对某个标签做格式化处理
Print(Soup.a.prettify())
会发现标签内容被漂亮的打印出来
标签树的平行遍历是有条件的
Ps: 平行遍历发生在同一父节点的各节点间
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Print(Soup.a.next_sibling) #打印出 a 标签的下一个平行标签
- # 这里打印出一个'and'类型于之前提到过的'\n'
- Print(Soup.a.next_sibling.next_sibling)# 打印出 a 标签的下一个平行标签的下一个平行标签
- print(Soup.a.previous)# 打印出的是一段文本解释 a 标签之前的信息
- # 同时也可以打印出 a 标签的前前平行标签的信息
- print(Soup.a.previous.previous)
find_all 方法
- Soup.find_all("a") #查找所有的 a 标签
- # 同时查找 a,b 标签
- Soup.find_all(["a","b"])# 作为一个列表形式
- for tag in Soup.find_all(True):
- Print(tag.name)
会打印出所有的标签
- Soup.find_all("p","course") #返回带有 course 属性值的所有 p 标签 (列表)
- Soup.find_all(id=link1) #查找 id 属性为 link1 的标签元素 (列表)
如果没有会返回一个空列表
beautifulsoup4
灵活又方便的网页解析库, 处理高效, 支持多种解析器. 利用它不用编写正则表达式即可方便地实现网页的提取.
使用方法:
案例代码展示可不看
- import requests
- from bs4 import *
- import re
- urls='https://www.dbmeinv.com/' #这是一个 urls 地址
- res=requests.get(urls) #获取网页内容
- t=res.text #网页 内容以文本形式赋值给 t
- # 匹配图片地址的正则
- # needs=r'https://wx.*?jpg'
- # pattern = re.compile(needs)
- # need= pattern.findall(t)
- # 获取标签内容和图片的地址的代码
- soup = BeautifulSoup(t,'lxml') # 解析器为 lxml
- list_img=soup.find('img') #寻找所有的 img 标签
- print(type(list_img[0])) #获取 src 属性即 图片的唯一地址
- print(list_img[0].get('src'))
- for img_src in list_img:
- print(img_src.get('src')) #遍历图片的地址
- list_url=soup.find_all('a') #寻找所有的 a 标签
- print(type(list_url[0]))
- print(list_url[0].get('href'))
- for img_url in list_img:
- print(img_url.get_text()) #获取 a 标签中的文本内容
- soup=BeautifulSoup(t,'html.parser')
- print(soup.find_all('a',class_='sister'))#class 是特殊属性, 因为 class 是关键字
- print(soup.find_all('a',id='link3'))# 用于查找有特定属性的标签
- sibling_soup = BeautifulSoup("<a><b id='bbb'>text1</b><b>text2</b></b></a>", 'html.parser')
- print(sibling_soup)
- print(sibling_soup.find('b',id='bbb')) #获取 id 为 bbb 的标签
- print(sibling_soup.find('b',id='bbb').next_sibling) #获取 id 为 bbb 的标签的下一个 b 标签
- ****
使用 BeatuifulSoup
引用 BeatuifulSoup
最常用的引用方式
Ps:B S 需要大写
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup("<p>data</p>",'html.parser')
- # 两个参数 一个是需要解析的内容 一个是解析器
- Soup=BeautifulSoup( open(path,"html.parser"))
BeatuifulSoup 基本元素
标签的认识可以参考 HTML
属性的应用
Demo 是一个 respose.text
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Print(Soup.title)
- # 打印出页面的 title 包含闭合标签的内容
- Tag=soup.a
- Print(Tag)# 打印 a 标签的内容包括各种属性
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Soup.a.name #获取 a 标签的名字
- Soup.a.parent.name #霸霸
- Soup.a.parent.parent.name #霸霸的霸霸
- # 对于一个标签可以使用. name 的方式获得他的名字 返回的是一个字符串形式
- Tag=soup.a
- Print(Tag.attrs)
- # 返回标签的属性 是一个字典格式
- # 对信息的提取
- Tag.attrs['class'] #获取 class 的值
- Tag.attrs["href"]# 获取 href 属性
- #Tag 的类型 是一个 bs4 种的一个内置类型
- Soup.a.string #a 标签内容的属性
- # 可以跨越多个标签层次即: 无视标签内容含有的标签
当标签内容中含有注释的时候
Soup.b.string 会正常打印标签内容无视注释效果
可通过类型判断
- Print(type("Soup.b.string"))
- Print(type("Soup.b.string"))
- # 基于 bs4 库中的 htm 库的遍历方法
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
Print(Soup.head) 获取 head 标签
- print(Soup.head.contents) #head 标签中的儿子标签是 title 标签
- # 返回的内容是一个列表
- print(Soup.body.contents)# 获取 body 的儿子标签
- Print(len(Soup.body.contents)) #获取 body 标签的儿子标签的数量
Ps: 子节点不知包括标签 甚至一些'\n'之类的换行符都可以是子节点
可通过列表类型的下表来检索其中的内容
- Soup.body.contents[1] #获取第二个元素
- # 也可以通过 for 循环遍历
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Print(Soup.title.parent) #打印出 title 标签的霸霸
- print(Soup.HTML.parent)#HTML 标签是 doc 中的最高级标签他的霸霸是他自己包含其中自己的全部内容
- print(Soup.parent)#soup 本身没有霸霸
这里插入一个方法
- Soup.prettify()
- # 这个方法就是在每个标签后加入一个 \ n
打印出来是十分规范的 h5 代码 一目了然
也可以对某个标签做格式化处理
Print(Soup.a.prettify())
会发现标签内容被漂亮的打印出来
标签树的平行遍历是有条件的
Ps: 平行遍历发生在同一父节点的各节点间
- from bs4 import BeatuifulSoup
- Soup = BeatuifulSoup(demo,""HTML.parser)
- Print(Soup.a.next_sibling) #打印出 a 标签的下一个平行标签
- # 这里打印出一个'and'类型于之前提到过的'\n'
- Print(Soup.a.next_sibling.next_sibling)# 打印出 a 标签的下一个平行标签的下一个平行标签
- print(Soup.a.previous)# 打印出的是一段文本解释 a 标签之前的信息
- # 同时也可以打印出 a 标签的前前平行标签的信息
- print(Soup.a.previous.previous)
find_all 方法
- Soup.find_all("a") #查找所有的 a 标签
- # 同时查找 a,b 标签
- Soup.find_all(["a","b"])# 作为一个列表形式
- for tag in Soup.find_all(True):
- Print(tag.name)
会打印出所有的标签
- Soup.find_all("p","course") #返回带有 course 属性值的所有 p 标签 (列表)
- Soup.find_all(id=link1) #查找 id 属性为 link1 的标签元素 (列表)
如果没有会返回一个空列表
来源: http://www.bubuko.com/infodetail-2976320.html