Проверьте, начинается ли фраза в ссылке с цифр, а затем с буквы с beautifullsoup

#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
 

Измените шаблон в соответствии с вашими потребностями, чтобы при необходимости цифры совпадали с цифрами в словах.