我想使用 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>
关于python - 带有 :not does not behave as expected 的 CSS 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56909999/