#python #selenium #beautifulsoup
#python #selenium #beautifulsoup
Вопрос:
Я хочу определить, есть ли на веб-странице несколько ссылок, начинающихся с цифры, а затем 2 таких слова :
- 23 причины … => статус «ок»
- 5 картинок в … => статус «ок»
- 10 фотографий, которые … => статус «ок»
- Эти 10 картинок будут => статус отсутствует
Для проверки определенного слова (ключевого слова) из списка (ключевых слов):
soup=BeautifulSoup(r,'html5lib')
links=soup.findAll('a')
clean_links = [link.text for link in links if link.text]
status = None
for keyword in keywords:
for link in clean_links:
if keyword in link:
status = "ok"
break
Ответ №1:
Давайте предположим, что ваш clean_links
внешний вид выглядит примерно так:
clean_links = ['23 reasons to .. ', '5 pictures to .. ', '10 photos that .. ', 'This 10 pictures will ..']
Теперь нам нужно разделить каждый элемент в этом списке, затем проверить, является ли первый элемент цифрой, а оставшиеся 2 — словами. В строках есть .isdigit()
.isalpha()
методы и, которые помогут вам здесь:
status_list = []
for link in clean_links:
# Getting only first 3 words separated by space
if len(link.split()) > 2:
first_three_words = link.split()[:3]
# -> ['23', 'reasons', 'to'] ...
if first_three_words[0].isdigit() and first_three_words[1].isalpha() and first_three_words[2].isalpha():
status_list.append("ok")
# status = "ok"
else:
status_list.append(None)
else:
status_list.append(None)
status_list
впоследствии будет выглядеть так:
print(status_list)
# -> ['ok', 'ok', 'ok', None]
Комментарии:
1. для некоторых чистых ссылок у меня ошибка «индекс вне диапазона». Я не могу понять, почему
2. @Mathieu возможно, некоторые
clean_links
из них содержат менее трех слов, и когда вы пытаетесь получить индекс 2, возникает эта ошибка. Как бы вы хотели работать со ссылками, содержащими менее 3 слов? достаточно 1 числа и 1 слова или что?3. ОК. если ссылки содержат менее 3 слов, статус по-прежнему «нет»
4. @Mathieu отредактировал ответ, проверьте, решает ли это проблему
Ответ №2:
используйте .isdigit()
if link[0].isdigit(): # get first character, strip() maybe required
print('start with digit')
else:
print('start with non digit/number')
Ответ №3:
Используйте это регулярное выражение, чтобы соответствовать этому шаблону: /^[0-9] W(w W){2}/gm
Ответ №4:
Вы можете использовать регулярное выражение для решения этой проблемы:
import re
reg_pattern = re.compile('^[0-9] [A-Z|a-z] [A-Z|a-z] .*')
clean_links = ["23 reasons to", "5 pictures to", "10 photos that", "This 10 pictures will", "2 3 n"]
for link in clean_links:
if reg_pattern.findall(link):
print("ok: " link)
Выходной сигнал:
ok: 23 reasons to
ok: 5 pictures to
ok: 10 photos that
Измените шаблон в соответствии с вашими потребностями, чтобы при необходимости цифры совпадали с цифрами в словах.