Используйте BeautifulSoup, чтобы найти конкретный тег на основе текста, который он покрывает?

#html #beautifulsoup

Вопрос:

Допустим, у меня есть следующий HTML:

 <div class="test">
<a class="someclass" href="somesite.com"> LINK </a>
<a class="someclass" href="othersite.com"> IMAGE</a>
</div>
 

есть ли способ получить href из всех a-тегов, инкапсулирующих текст «ССЫЛКА», т. е. в этом примере somesite.com ?

Ответ №1:

Проблема в том, что вы пытаетесь найти текст, в котором есть пробелы. Вы можете использовать Regular Expressions , чтобы игнорировать пробелы и выполнять find text

 from bs4 import BeautifulSoup
import re

html = '''<div class="test">
<a class="someclass" href="somesite.com"> LINK </a>
<a class="someclass" href="othersite.com"> IMAGE</a>
</div>'''

soup = BeautifulSoup(html, 'html.parser')
regex = re.compile(r's*%ss*' % 'LINK')
results = soup.find("a", text=regex)
print(results['href'])
 

Выход:

somesite.com

Альтернативный способ-предварительно find_all сформировать, а затем просмотреть результаты и сравнить текст с помощью text.strip()

 from bs4 import BeautifulSoup
    
html = '''<div class="test">
<a class="someclass" href="somesite.com"> LINK </a>
<a class="someclass" href="othersite.com"> IMAGE</a>
</div>'''

# Find href by text 'link'
soup = BeautifulSoup(html, 'html.parser')
results = soup.find_all('a')
print([x['href'] for x in results if x.text.strip() == 'LINK'])
 

Выход

 ['somesite.com']
 

Комментарии:

1. Да, пока что это мой подход. Интересно, было ли что-то вроде выбора CSS или что-то еще, что могло бы его вытащить. Хотя спасибо

2. Чтобы избежать двойной петли над супом

3. @CutePoison — чтобы избежать двойного цикла, вы можете использовать регулярное выражение