#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 — чтобы избежать двойного цикла, вы можете использовать регулярное выражение