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