簡體   English   中英

用soup.select在美麗的湯中選擇第二個孩子?

[英]selecting second child in beautiful soup with soup.select?

我有:

<h2 id='names'>Names</h2>
<p>John</p>
<p>Peter</p>

如果我已經有了 h2 標簽,那么現在讓 Peter 在這里的最簡單方法是什么? 現在我試過了:

soup.select("#names > p:nth-child(1)")

但在這里我得到了第 n 個孩子 NotImplementedError:

NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type.

所以我不確定這里發生了什么。 第二種選擇是只獲取所有 'p' 標簽子項並硬選擇 [1],但是存在索引超出范圍的危險,這需要圍繞每次嘗試使用 try/except 獲取Peter ,這有點愚蠢。

有什么辦法可以用soup.select()函數選擇第n個孩子?

編輯:用 nth-of-type 替換 nth-child 似乎可以解決問題,所以正確的行是:

soup.select("#names > p:nth-of-type(1)")

不知道為什么它不接受 nth-child 但似乎 nth-child 和 nth-of-type 都返回相同的結果。

將您的編輯添加為答案,以便其他人更容易找到它:

使用nth-of-type而不是nth-child

soup.select("#names > p:nth-of-type(1)")

'nth-of-child' 根本沒有在 beautifulsoup4 中實現(在撰寫本文時),beautifulsoup 代碼庫中根本沒有代碼可以做到這一點。 作者明確添加了“NotImplementedError”來解釋這一點, 這是代碼

鑒於您在問題中引用的 html,您不是在尋找 h2#names 的孩子。

您真正要尋找的是第二個相鄰的兄弟姐妹,我不是 css 選擇器大師,但我發現這行得通。

soup.select("#names + p + p")

Beautiful Soup 4.7.0(2019 年初發布) 現在支持大多數選擇器,包括:nth-child

從 4.7.0 版本開始,Beautiful Soup 通過 SoupSieve 項目支持大多數 CSS4 選擇器。 如果您通過pip安裝了 Beautiful Soup,則同時安裝了 SoupSieve,因此您無需執行任何額外操作。

所以,如果你升級你的版本:

pip install bs4 -U

您將能夠使用幾乎所有您需要的選擇器,包括nth-child

也就是說,請注意,在您的輸入 HTML 中, #names h2標簽實際上沒有任何子項:

<h2 id='names'>Names</h2>
<p>John</p>
<p>Peter</p>

這里只有 3 個元素,它們都是兄弟元素,所以

#names > p:nth-child(1)

即使在 CSS 或 Javascript 中也不起作用。

如果#names元素將<p>作為元素,則您的選擇器在一定程度上可以工作:

html = '''
<div id='names'>
    <p>John</p>
    <p>Peter</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')
soup.select("#names > p:nth-child(1)")

輸出:

[<p>John</p>]

當然, John <p>#names父級的第一個子#names 如果您想要Peter ,請使用:nth-child(2)

如果元素都是相鄰的兄弟元素,則可以使用+選擇下一個兄弟元素:

html = '''
<h2 id='names'>Names</h2>
<p>John</p>
<p>Peter</p>
'''
soup = BeautifulSoup(html, 'html.parser')
soup.select("#names + p + p")

輸出:

[<p>Peter</p>]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM