2013年1月31日 星期四

[Python] BeautifulSoup 中Tag 物件的 string 與 text 屬性的差別是什麼?

 BeautifulSoup 是一款相當著名的 Python HTML/XML parser。簡單的使用方式讓幾乎任何人都能很輕易的上手並使用這個 library。唯一的問題是,BeautifulSoup 的文件實在太少,而且似乎沒有一份完整的 API 說明,造成在使用某些功能時必須三不五時的按 F3 trace library 原始碼,實在有點擾人。在這邊要說明的就是其中一個困擾我蠻久的一個問題:Tag物件中stringtext屬性的差別到底是什麼?

 這兩個屬性間的差別是:Tag.string代表的是該 HTML/XML 標籤內含的文字,其資料型態為bs4.NavigableString。例如:

例一:
HTML:
<td width="20%"> Something </td>

Python code:
td = soup.find('td')
print table.string # Something
print table.text # Something

 Tag.text則是該標籤中,所有子標籤內含的文字。若其中有標籤不具備文字內容,則text會將其視為空字串一併丟出。所以,Tag.text總是有值,而不會出現為None的情況

例二:

soup = BeautifulSoup('<img src="/img/test.jpg"/>')

print soup.string # None
print soup.text # (空字串)

例三 :
HTML:
<table>
  <tr>
    <td width="20%"> ID </td> 
    <td width="30%"> 姓名 </td>
  <tr/>
  <tr>
    <td width="20%"> 001 </td> 
    <td width="30%"> Shih-Peng Lin </td>
  <tr/>
</table>

Python code:
table = soup.find('table')
print table.string # None
print table.text  
# ID 
# 姓名 
# 001 
# Shih-Peng Lin

 換句話說就是:如果一個Tagstring,那他就必定有text;但如果Tagtext屬性,則不一定會有string屬性。

沒有留言:

張貼留言