BeautifulSoup 是一款相當著名的 Python HTML/XML parser。簡單的使用方式讓幾乎任何人都能很輕易的上手並使用這個 library。唯一的問題是,BeautifulSoup 的文件實在太少,而且似乎沒有一份完整的 API 說明,造成在使用某些功能時必須三不五時的按 F3 trace library 原始碼,實在有點擾人。在這邊要說明的就是其中一個困擾我蠻久的一個問題:Tag物件中string與text屬性的差別到底是什麼?
這兩個屬性間的差別是: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
換句話說就是:如果一個Tag有string,那他就必定有text;但如果Tag有text屬性,則不一定會有string屬性。
沒有留言:
張貼留言