В BeautifulSoup 4.7.0+, как я могу выбрать все элементы, которые не содержат указанный текст в одном из своих свойств - PullRequest
1 голос
/ 09 октября 2019

Я хочу выбрать все теги привязки, которые не содержат mailto: в их свойстве href.

До версии 4.7.0 BeautifulSoup я мог использовать этот код:

links = soup.select("a[href^=mailto:]")

Версия 4.7.0 BeautifulSoup заменила реализацию CSS-селектора на SoupSieve, которая должна быть более современной и полной.

К сожалению, приведенный выше код теперь выдает эту ошибку:

soupsieve.util.SelectorSyntaxError: Malformed attribute selector

Какая замена для этого кода? Как правильно нацелиться на те же самые элементы?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

IE <8 не распознает этот escape <code>\:, поэтому стоит знать, что вы также можете использовать кодовые точки. Также вы хотите отменить исключение с помощью :not (bs4 4.7.1+)

from bs4 import BeautifulSoup as bs

html = '''
<html>
 <head></head>
 <body>
  <a href="mailto:NotMe@somewhere.com" target="_blank">Nada</a> 
  <a href="https://www.address.com" target="_blank">Tada</a>
 </body>
</html>
'''
soup = bs(html, 'lxml')
print(soup.select('[href]:not([href*=mailto\\3A])'))

NB. В браузере будет [href*=mailto\3A]

1 голос
/ 09 октября 2019

Похоже, что двоеточие в значении href просто необходимо экранировать .

Вы можете сделать это, выбрав отдельный символ:

soup.select("a[href^=mailto\\:]")

Или путем кавычки всего значения:

soup.select('a[href^="mailto:"]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...