簡體   English   中英

帶:not的CSS選擇器的行為不符合預期

[英]CSS selector with :not does not behave as expected

我想使用CSS選擇器在Python中使用CSS選擇器選擇具有SOUND WORD值的元素之后,但具有值稱為COMPONENTS的元素之前的所有內容。

<p class="p_cat_heading">SOUND WORD</p>
<p class="p_normal__and__avoid_page_break_after"><span class="c_tone_char">Vene</span><span class="c_tone_char__and__underline">zue</span><span class="c_tone_char">la</span> /<span class="calibre22">venedswela</span>/</p>
<p class="p_normal__and__avoid_page_break_after">South American country over the equator, known in part for its sunny beaches. Pronounce it in Italian for a better sound match.</p>
<p class="p_normal__and__avoid_page_break_after"><img width="30%" alt="" src="../images/00461.jpeg" class="calibre18"/></p>
<p class="p_cat_heading__and__centre_alignment">COMPONENTS</p>

我正在使用以下CSS選擇器:

content = str(soup.select_one('.p_cat_heading:contains("SOUND WORD") + :not(.p_cat_heading)'))  # type: str

這應該選擇所有帶有類p_cat_heading的元素。 但是,它僅選擇:

<p class="p_normal__and__avoid_page_break_after"><span class="c_tone_char">Vene</span><span class="c_tone_char__and__underline">zue</span><span class="c_tone_char">la</span> /<span class="calibre22">venedswela</span>/</p>

我必須誤會CSS選擇器的工作方式。 我以為:就像Python切片一樣工作,但事實並非如此。 也就是說,我不確定我缺少什么。

感謝@Barmar在這一方面的幫助。 要重申他的評論,您不能使用CSS選擇器執行此操作。 相反,我所做的是遍歷元素,直到到達定界符為止:

for temp_heading in heading.find_next_siblings():
    if temp_heading.attrs["class"][0] == "p_cat_heading":
        break
    else:
        print(str(temp_heading))
organized_entry["soundword"] = content

其中temp_heading是bs.element.Tag的一個實例,它的開頭是:

<p class="p_cat_heading">SOUND WORD</p>

如果您顯示的是,則可以使用過濾並過濾掉第二個搜索字符串中的p標簽,或者從第一個搜索字符串的同級p標簽中篩選出同級標簽。 這非常符合您顯示的內容。

from bs4 import BeautifulSoup as bs

html = '''
<html>
 <head></head>
 <body>
  <p class="p_cat_heading">SOUND WORD</p> 
  <p class="p_normal__and__avoid_page_break_after"><span class="c_tone_char">Vene</span><span class="c_tone_char__and__underline">zue</span><span class="c_tone_char">la</span> /<span class="calibre22">venedswela</span>/</p> 
  <p class="p_normal__and__avoid_page_break_after">South American country over the equator, known in part for its sunny beaches. Pronounce it in Italian for a better sound match.</p> 
  <p class="p_normal__and__avoid_page_break_after"><img width="30%" alt="" src="../images/00461.jpeg" class="calibre18"></p> 
  <p class="p_cat_heading__and__centre_alignment">COMPONENTS</p>
 </body>
</html>
'''
soup = bs(html, 'lxml')
result = [item.text.strip() for item in soup.select('p:contains("SOUND WORD") ~ p:not(p:contains("COMPONENTS") ~ p, p:contains("COMPONENTS"))')]

暫無
暫無

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

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