1. 程式人生 > 其它 >notepad+提取引號之間的內容_資訊的標記和提取方法

notepad+提取引號之間的內容_資訊的標記和提取方法

技術標籤:notepad+提取引號之間的內容

797a55ffcdd5b161cebbeef303ebde82.png

在入行之前,需要介紹一些行外人不甚清楚的行內常識。

  1. 標記後的資訊可形成資訊組織結構,增加了資訊維度
  2. 標記的資訊與資訊一樣具有同等的重要價值
  3. 標記後的資訊更適合通訊、儲存和展示
  4. 標記後的資訊更利於程式的理解和運用

比如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型別的物件,也可以是一個標籤,表意問題而已。

到這裡生命終於大和諧了,有些部分搞得我心累,各位,江湖再見。