notepad+提取引號之間的內容_資訊的標記和提取方法
技術標籤:notepad+提取引號之間的內容
在入行之前,需要介紹一些行外人不甚清楚的行內常識。
- 標記後的資訊可形成資訊組織結構,增加了資訊維度
- 標記的資訊與資訊一樣具有同等的重要價值
- 標記後的資訊更適合通訊、儲存和展示
- 標記後的資訊更利於程式的理解和運用
比如HTML語言,就是通過預定義的<>...</>結構組織不同型別的資訊。其是World Wide Web的資訊組織方式,也就是說整個全球資訊網上的資訊都是由它組織的。
而資訊標記則主要有3中形式
- XML形式:eXtensible Markup Language
- JSON形式:JavaScript Object Notation
- YAML形式:YAML Ain't Markup Language
HTML語言即採用的XML形式,我之前在BeautifulSoup庫中已經展示過不少,大致用下面這三行可以解釋其標記方法:
<tag class="123">abc</tag>
<tag class="ABCD"/>
<!--A comment-->
JSON形式用下面這三行解釋,需要注意的是,其鍵值對是有型別的,也就是說分字串型別還是字典型別
{ "key" : "value" "key" : ["value1", "value2"] "key" : {"subkey0" : "subvalue0", "subkey1" : "subvalue1"} }
而YAML形式的鍵值對則是無型別的,僅指字串。用縮排表達所屬關係,用“-”表達並列關係,用管道符號“|”表示整塊資料,“#”表示註釋。如下:
key : value
key :
subkey0 : subvalue0
subkey1 : subvalue1
key:
- value0
- value1
key : |
*****************************
***假裝這裡有個整塊資料***
*****************************
key: #Comment
總結一下:
XML是最早的通用資訊標記語言,可擴充套件性好,但繁瑣。用於Internet上的資訊互動與傳遞
JSON的資訊有型別,適合程式處理(js),較XML簡潔,連註釋都沒有,一般用於移動應用雲端和節點的資訊通訊
YAML的資訊無型別,文字資訊比例最高,可讀性好,是各類系統的配置檔案,有註釋易讀
關於資訊的提取,也有一些方法,在此介紹給大家,之前有說過標籤有一個.attrs屬性,可以把某個標籤的屬性以字典的形式列出來。而如果想獲得某個屬性的具體的值,則有一個get方法,如下:
value = soup.get("class")
其實這個get方法也就相當於attrs.get()了,字典型別的資料都是可以使用get()方法的。
當然還不僅僅只是這樣,這裡是關於標籤屬性值相關的操作,對標籤的attrs屬性可執行的操作和對一個字典型別的資料可執行的操作幾乎一樣。可以都移植過來。
比如vale = tag["class"]
即可獲得該tag的class屬性值,也進行刪除修改也都一個道理。雖是對attrs屬性的操作,但因為其使用情況較多又難打字,所以最終的程式碼格式就縮去了.attrs
。使其更為簡便。.attrs
在這裡是可加可不加的。
具體想找哪個屬性的值,把引號裡面的class換一下就可以了。之前還介紹了找標籤時用到的find_all()
方法,在此再全面介紹擴充一下,其完整格式為:
<>.find_all(name, attrs, recursive, string, **kwargs)
該方法返回一個列表型別,儲存查詢到的結果。
name引數表示是對標籤名稱的檢索,可以傳入一個字串過去,如果想找多個型別的標籤,也可以傳一個列表過去。
如果一個指定名稱的引數不是搜尋內建的引數名,搜尋時會把該引數當作指定名字tag的屬性來搜尋,如果包含一個名字為id的引數,Beautiful Soup則會搜尋tag看看哪一個tag匹配該“id”屬性.如下:
soup.find_all(id="123")
注意:HTML中的屬性的值的引號可加可不加,這裡的咒語中的設定的值的引號也是可嫁可不加,但是指定的名稱一定不能加。
按照CSS類名搜尋tag的功能非常實用,但標識CSS類名的關鍵字class在Python中是保留字,使用class做引數會導致語法錯誤.從Beautiful Soup的4.1.1版本開始,可以通過class_引數搜尋有指定CSS類名的tag:
soup.find_all("a", class_="sister")
如果第二個引數的位置並沒有指定名稱,也是預設搜尋class屬性,其他屬性就沒這麼好的待遇了。
想同時匹配多個引數,則需要用逗號隔開。
還可以直接用attrs引數來匹配,把指定名稱放在一個字典裡,如下:
soup.find_all(attrs={"id": '132'})
採用這種方法匹配的,如果想匹配多個屬性,在咒語中填寫的順序還得和HTML中屬性的順序相同才行。
另外,有些tag屬性在搜尋不能使用,比如HTML5中的 data-* 屬性。這時候也可以使用attrs引數來匹配。
除字串以外,搜尋指定名稱的屬性時可以使用的引數值還有正則表示式,True。如下:
- soup.find_all(href=re.compile("elsie"))
- soup.find_all(id=True)
當值為True的時候,也就意味著,不管id屬性是多少,只要有這個屬性,通通都能匹配。
另外,在HTML語言中,在寫程式時,在多個屬性之間用","隔開本來是沒有錯誤的,但是在BeautifulSoup這裡,會把逗號“,”也是別為一個屬性,因此,最好慎用以及多多關注這個特性。
終於把這裡的attrs講完了,好累。神氣大傷,空一行先。
第三個形參recursive表示是否對子孫節點全部檢索,預設為True。
呼叫tag的findall()方法時,Beautiful Soup會檢索當前tag的所有子孫節點,如果只想搜尋tag的直接子節點,可以將引數設定為recursive=False。這也就暗示著。find_all()方法是對子孫節點進行搜尋,而不包含當前節點(從邏輯上講也沒必要)。
string形參表示對非屬性字串進行檢索 。
最後,還有一個陰招,即
soup.find_all(..)等價於soup(..)
即中間的.findall可要可不要,關鍵時候可以少打幾個字。這也暗示了find_all方法和其他find方法比較為基礎,所以可以縮略著寫。當然,這裡的soup可以是BeautifulSoap型別的物件,也可以是一個標籤,表意問題而已。
到這裡生命終於大和諧了,有些部分搞得我心累,各位,江湖再見。