2017-04-05 139 views

回答

2

雖然<\p>無效,但lxml會嘗試關閉第一個標記,因此此代碼有效。 html.parser在這個領域做得不好。

soup = BeautifulSoup("<p>'hello'<a>'my link'</a></p>", 'lxml') 
print(soup.p.get_text(strip=True)) 

,輸出:

'hello''my鏈接'

0
>>>soup = BeautifulSoup("<p>adA<a>asda</a>asda</p>") 
>>> soup.p 
<p>adA<a>asda</a>asda</p> 
>>> soup.p.text 
u'adAasdaasda' 

我認爲BS不能真正得到只有幾段文字,因爲有AA標籤嵌套在裏面。我認爲,當你嘗試獲取文本時,它會遞歸地從所有子節點獲取文本並將其附加到輸出中。

+2

包括一個詳細的解釋如何解決問題的問題,不要只寫代碼。 –

1

由於最初發布的<\p>只是一個錯字,這是您的問題實際上是關於什麼。

這是關於如何.stringBeautifulSoup工作。它的工作原理不同,這取決於元素的子 - if an element has multiple children, it returns None

如果一個標籤包含一個以上的事情,那麼,目前還不清楚應該是指什麼.string,所以.string被定義爲None

公告,如何.stringp元素爲None,但a它不是:

In [1]: from bs4 import BeautifulSoup 

In [2]: soup = BeautifulSoup("<p>'hello'<a>'my link'</a></p>", 'html.parser') 

In [3]: print(soup.p.string) 
None 

In [4]: print(soup.p.a.string) 
'my link' 

獲得元素的文本正確的,更可靠的方法是通過.get_text()

In [5]: print(soup.p.get_text(strip=True)) 
'hello''my link' 
+0

感謝您的巨大澄清。你能告訴我把strip = true的作用是什麼嗎? – Hamza

+0

@HamzaKourati它只是有助於擺脫圍繞文本值的多餘空格和換行符。樂意效勞。 – alecxe

相關問題