Пробелы вокруг CSS-комбинаторов действительно необязательны? - PullRequest
0 голосов
/ 21 ноября 2018

Меня немного смущает использование CSS-селекторов с осевыми комбинаторами в BeautifulSoup.Ниже приведен простой код, иллюстрирующий, что я имею в виду:

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 или чего-то еще?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

, если вы хотите исправить это, см. 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>
0 голосов
/ 21 ноября 2018

Это подтверждается как ошибка здесь: https://bugs.launchpad.net/beautifulsoup/+bug/1717851

Селектор, с точки зрения CSS, подходит с / без.

Я посмотрю, смогу ли я найти дополнительные доказательства.

Человек, сообщающий об ошибке, сообщает:

Насколько я понимаю, проблема в том, что, поскольку код выполняет только shlex.split, он не обрабатывает div, > и span как отдельные сущности - это пробел с каждой стороны от >.

...