К сожалению, ваше понимание того, что делают :not()
и :has()
, скорее всего, неверно.
В первом примере вы используете:
soup.select_one("tr:not(a)").text
То, как вы его используете, будет выбирать каждый tr
. Это потому, что он говорит: «Я хочу тег tr
, который не является тегом a
. Теги tr
никогда не являются тегами a
, поэтому ваш код всегда захватывает текст любого тега tr
, включая тот, который содержит 27A-TAX DISTRICT
.
Если вы хотите, чтобы теги tr
не имели тегов a
, вы можете использовать:
soup.select_one("tr:not(:has(a))").text
Это говорит о том, что «я хочу тег tr
, у которого нет тега a
потомка».
Для получения дополнительной информации читайте:
Это приводит нас ко второму вопросу. :has()
- реляционный селектор. Во втором примере вы использовали:
soup.select_one("p:has(.vital)").text
:has()
смотрит вперед на потомков, потомков или братьев и сестер (в зависимости от используемого вами синтаксиса), чтобы определить, является ли тег тем, который вам нужен.
То, что вы сказали, было: «Я хочу тег p
, который имеет тег-потомок с классом vital
». Ни один из ваших тегов p
даже не имеет потомков, поэтому нет никакого способа получить класс vital
. То, что вы хотите, на самом деле проще:
soup.select_one("p.vital").text
Это говорит о том, что "я хочу тег p
, который также имеет класс vital
."
Для получения дополнительной информации читайте: