2015-03-24 25 views
1

的孩子我的HTML代碼段使用BeautifulSoup如下:額外的換行符爲美麗的湯

s = """<div class="views-row views-row-1 views-row-odd views-row- first"> 
      <span class="views-field views-field-title"> 
       <span class="field-content"><a href="/party-pictures/2015/love-heals">Love Heals</a> 
       </span> 
      </span> 
      <span class="views-field views-field-created"> 
       <span class="field-content">Friday, March 20, 2015 
       </span> 
      </span> 
</div>""" 

soup = BeautifulSoup(s) 

爲什麼s.span只返回第一個span標記?

此外s.contents返回一個長度爲4的列表。這兩個span標籤都在列表中,但第0和第2個索引是「\ n $新行字符,新行字符是無用的。做?

回答

3

爲什麼s.span只返回第一個span標籤?

s.span是一個快捷方式到s.find('span')這將找到span標籤的首次出現只。

此外s.contents返回一個長度爲4的列表。兩個span標籤都在列表中,但第0和第2個索引是「\ n $新行字符。新的一行字符是無用的。這是完成的原因嗎?

根據定義,.contents輸出所有元素的兒童,包括文本節點列表 - 的NavigableString class實例。

如果你只想要的標籤,你可以使用find_all()

soup.find_all() 

而且,如果只span標籤:

soup.find_all('span') 

例子:

>>> from bs4 import BeautifulSoup 
>>> s = """<div class="views-row views-row-1 views-row-odd views-row- first"> 
...    <span class="views-field views-field-title"> 
...     <span class="field-content"><a href="/party-pictures/2015/love-heals">Love Heals</a> 
...     </span> 
...    </span> 
...    <span class="views-field views-field-created"> 
...     <span class="field-content">Friday, March 20, 2015 
...     </span> 
...   </span> 
... </div>""" 
>>> soup = BeautifulSoup(s) 
>>> for span in soup.find_all('span'): 
...  print span.text.strip() 
... 
Love Heals 
Love Heals 
Friday, March 20, 2015 
Friday, March 20, 2015 

的原因重複的是嵌套span元素。你可以用不同的方法修復它。例如,可以使div內搜索僅recursive=False

>>> for span in soup.find('div', class_='views-row-1').find_all('span', recursive=False): 
...  print span.text.strip() 
... 
Love Heals 
Friday, March 20, 2015 

或者,您也可以使用CSS Selectors

>>> for span in soup.select('div.views-row-1 > span'): 
...  print span.text.strip() 
... 
Love Heals 
Friday, March 20, 2015 
+0

soup.find_all(「跨度」)仍然不適合工作我。我原以爲它會返回一個長度爲2的列表,但是我只能得到長度爲1的列表,它的類型是bs4.element.ResultSet – Ben 2015-03-25 02:44:17

+0

@Ben我已經做了更新,希望它有助於理解。 – alecxe 2015-03-25 02:51:45

+0

謝謝。這並不像我希望的那樣乾淨。在我看來,有兩個span標籤是div標籤的直接子標籤。我正在以我寫html的方式將它看作一個樹結構。我想通過調用.content()或.children()來獲得這兩個子樹是一種簡單的方法,謝謝你的幫助 – Ben 2015-03-25 03:12:09