1 BeautifulSoup
只要目标信息的旁边或者附近有标签就可以调用 ,,不用管是几层标签(父辈 后代辈 的都可以)。
Soup.html.body.h1
Soup.body.h1
Soup.html.h1
Soup.h1
索引的效果都是同一个内容。
但是应该把重要的标签包含进去,以免过于简单爬到不想要的内容。
2
<li>
<div aria-label="5星, 747 份评分" class="rating" role="img"><div>
</li>
在这里的li 和 div都是标签用法可以soup.li soup.div
而aria-label class role是属性 用法则区别于标签 ,引用用div.attrs
比如 list=soup.findAll(“div”,{“role”:”img”})
div是标签 而大括号里面的role和img是改标签下的类的属性
同样等价于list=soup.findAll(“div”,attrs= “role”:”img”})
3注意下find与findAll的用法
soup.div.findAll("img") 会找到第一个div标签中的全部img 并不是全部div标签的img
soup.div.find_next("div").findAll('img')说明是找到第二div标签中的所有img
4
bs4的数据类型
Tga标签
最基本的信息组织单元,分别用<>和</>标明开头和结尾
例如:
from bs4 import BeautifulSoup
import requests
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
soup=BeautifulSoup(demo,"html.parser")
print(soup.title)
print(soup.a)
输出为
<title>This is a python demo page</title>
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
任何存在于HTML语法中的标签都可以用soup.<tag>访问获得
当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个
类型 <class 'bs4.element.Tag'>
Tag的name
name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name
例子:
from bs4 import BeautifulSoup
import requests
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
soup=BeautifulSoup(demo,"html.parser")
print(soup.a.name)
print(soup.a..parent.name)
输出为 “a”
“p”
每个<tag>都有自己的名字,通过<tag>.name获取
字符串类型<class 'str'>
Tag的attrs(属性)
Attributes:标签的属性,字典形式组织,格式:<tag>.attrs
例子:
from bs4 import BeautifulSoup
import requests
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
soup=BeautifulSoup(demo,"html.parser")
tag=soup.a
print(tag.attrs)
print(tag.attrs['class'])
输出为:
字典类型<class 'list'>
Tag的NavigableString
NavigableString:标签内非属性字符串,<>…</>中字符串,格式:<tag>.string
from bs4 import BeautifulSoup
import requests
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
soup=BeautifulSoup(demo,"html.parser")
print(soup.a.string)
soup.a为
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
输出为 Basic Python NavigableString可以跨越多个层次
类型 :<class 'bs4.element.NavigableString'>
Tag的Comment
Comment:标签内字符串的注释部分,一种特殊的Comment类型
类型为<class 'bs4.element.Comment'>
例子:
newsoup=BeautifulSoup("<b><!--This is a conment --></b><p>This is not a conment</p>","html.parser")
print(newsoup.b.string)
输出为
可见 并不是标签<b blalal /b>
而是直接<b> 所以他不是一个标签类型 而是comment
总结:
这里我们要注意遍历html树的时候几个特殊的输出类型