CSS组合子周围的空格真的是可选的吗



在BeautifulSoup中使用带有轴组合子的CSS选择器让我有点困惑。下面是简单的代码来说明我的意思:

from bs4 import BeautifulSoup as bs
import requests
response = requests.get('https://stackoverflow.com/questions/tagged/python')
soup = bs(response.text)
print(len(soup.select('#mainbar > div'))) 

返回6子级。。。但是

print(len(soup.select('#mainbar>div')))

返回0子级。。。

'#mainbar ~ div'(发现1个同级(和#mainbar~div'(未发现(相同

从文档中可以看出,这些空格是可选的,但事实上,对于相同的选择器,我用BeautifulSoup得到了不同的输出(正如我所想的(

所以是bs4错误还是这种行为取决于CSS版本或其他什么?

这在这里被确认为一个错误:https://bugs.launchpad.net/beautifulsoup/+bug/1717851

从CSS的角度来看,选择器可以使用/不使用。

我会看看是否能找到进一步的证据。

报告错误的个人状态:

在我看来,问题在于,由于代码只执行shlex.split,它不将div>span视为单独的实体是在CCD_ 10的任一侧留出的空间。

如果您想修补它,请参阅bs4/element.py第1440行替换

tokens = shlex.split(selector)

带有

selector = re.sub(r's*([+>~])s*', r' 1 ', selector)
tokens = shlex.split(selector)

演示:

<script type="text/javascript" src="//cdn.datacamp.com/dcl-react.js.gz"></script>
<div data-datacamp-exercise data-lang="python">
<code data-type="sample-code">
import re, shlex
def testSelect(selector):
selector = re.sub(r's*([+>~])s*', r' 1 ', selector)
tokens = shlex.split(selector)
print(tokens)
testSelect('#mainbar > div ~ p') # default
testSelect('#mainbar>div~p')
testSelect('#mainbar    >div+     p')
testSelect('#mainbar.classA')
testSelect('#mainbar p')
</code>
</div>

最新更新