Вопрос:
BeautifulSoup
обеспечивает очень ограниченную поддержку селекторов CSS. Например, единственный поддерживаемый псевдокласс - nth-of-type
, и он может принимать только числовые значения - аргументы типа even
или odd
не разрешены.
Можно ли расширить селектор CSS BeautifulSoup
или позволить ему использовать lxml.cssselect
внутри себя как основной механизм выбора CSS?
Посмотрите пример пример/пример использования . Найдите только четные строки в следующем HTML:
<table>
<tr>
<td>1</td>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<td>4</td>
</tr>
</table>
В lxml.html
и lxml.cssselect
, это легко сделать через :nth-of-type(even)
:
from lxml.html import fromstring
from lxml.cssselect import CSSSelector
tree = fromstring(data)
sel = CSSSelector('tr:nth-of-type(even)')
print [e.text_content().strip() for e in sel(tree)]
Но в BeautifulSoup
:
print(soup.select("tr:nth-of-type(even)"))
выдаст ошибку:
NotImplementedError: только числовые значения поддерживаются в настоящее время для псевдокласса nth-type.
Обратите внимание, что мы можем обойти это с помощью .find_all()
:
print([row.get_text(strip=True) for index, row in enumerate(soup.find_all("tr"), start=1) if index % 2 == 0])