python3 BS4 BeautifulSoup 解析的一些解析(迷惑点)

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'])

输出为:

{'href': 'http://www.icourse163.org/course/BIT-268001', 'id': 'link1', 'class': ['py1']}
['py1']
一个<tag>可以有0或多个属性

字典类型<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)

输出为

This is a conment 
 
   
类型为 <class 'bs4.element.Comment'>

可见 并不是标签<b blalal   /b>

而是直接<b>  所以他不是一个标签类型 而是comment

总结:




这里我们要注意遍历html树的时候几个特殊的输出类型

注意到 soup.children返回的类型是一个迭代器 并不能用BeautifukSoup的方法进行检索了。
而且需要注意到的是soup.findAll(```)返回的也是一个set迭代 如果再利用BearutifulSoup方法索引
可能就会出现错误 比如a.attrs["td"]
正确的表达方式应该用列表或者迭代器的方法 a("td")
更加注意 soup.find 和findAll有很大的区别 find找的是标签 findAll找的是set


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值