Python — пытается заставить beautifulsoup находить слова в списке, но не может их найти

#python #list #if-statement #web-scraping #beautifulsoup

#python #Список #if-statement #веб-очистка #beautifulsoup

Вопрос:

Я работаю над своим первым проектом, который не взят прямо из книги, но у меня возникли проблемы с запуском функции.

Функция получает список строк и объект BeautifulSoup и пытается найти каждое слово в soup.text . Однако код, похоже, вообще не может найти какие-либо слова / строки, даже когда я уверен, что он должен их находить. Я проверил и подтвердил, что функция определенно правильно получает список и что URL работает и возвращает то, что я ожидаю, когда я делаю что-то вроде print(urlSoup) .

Соответствующий код:

 def find_words(words_list, urlSoup):
    for word in words_list:
        words_count = 0
        if word.casefold() in urlSoup:
            # ideally it should also count the number of times the word shows up with the 'words_count' bit,
            # but I have an impression that this also won't work how I want it to. 
            words_count  = 1
            print("The word "   word   " was found "   str(words_count)   " times in "   url   ".")
        else:
            print("The word '"   word   "' was not found in the URL you provided.")
 

Я пытался исправить тот факт, что оператор IF не активируется (предположительно, потому, что он не находит никаких слов / строк из списка в soup.text), включая удаление .casefold() бита, изменение soup.text soup.content и изменение оператора IF на что-то вроде

 if urlSoup.find_all(word):
 

Я также изменил синтаксический анализатор для BeautifulSoup на lxml , но это тоже не сработало. На данный момент я немного застрял, и, несмотря на то, что я немного изучил Stack Overflow и документацию bs4, мне еще не удалось взломать это. Я уверен, что решение до боли очевидно, но, как новичок, я боюсь, что мне здесь нужна небольшая помощь.

Я надеюсь, что я предоставил достаточно информации, пожалуйста, не стесняйтесь спрашивать, нужно ли вам, чтобы я объяснил дальше.

Редактировать с информацией в соответствии с запросом chitown88: вот пример списка слов

 ['running', 'outdoors', 'outdoor', 'shoes', 'clothing', 'delivery']
 

Я использовал этот список с соответствующим веб-сайтом, но urlSoup немного велик для публикации здесь, поэтому вот ссылка на Google Drive, если это нормально. Пожалуйста, дайте мне знать, если это не так, и вы бы предпочли, чтобы я сделал что-то еще.
https://drive.google.com/file/d/1bhLjNLxHOrNvA3BBfm2Qh8qDrk5fLYp7/view?usp=sharing

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

1. можете ли вы предоставить urlSoup и образец вашего words_list ?

2. также в вашей функции у вас есть переменная url , но она не определена.

3. @chitown88 Я добавил список слов и предоставил urlSoup (надеюсь, вы можете получить к нему доступ). Извините, что не разместил суп здесь, но я подумал, что он слишком длинный.

Ответ №1:

вы использовали try except block? возможно, проблема с кодировкой файла, потому что я получил ошибку с soup.txt

 UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 91868:
 

И words_count всегда будет 0 или 1, вам нужно использовать .count() или Regex подсчитать, сколько раз в нем присутствует подстрока

 import re

def find_words(words_list, urlSoup):
    url = 'soup.txt'
    for word in words_list:
        words_count = len(re.findall(word, urlSoup, re.IGNORECASE)) # remove re.IGNORECASE if you need exact casing
        # or
        # words_count = urlSoup.count(word) # exact casing
        if words_count > 0:
            print("The word "   word   " was found "   str(words_count)   " times in "   url   ".")
        else:
            print("The word '"   word   "' was not found in the URL you provided.")
 
# add encoding="utf-8" to fix file read           
with open('soup.txt', 'r', encoding="utf-8") as f:
    words_list = ['running', 'outdoors', 'outdoor', 'shoes', 'clothing', 'delivery']
    find_words(words_list, f.read())
 

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

1. Большое вам спасибо, с помощью предоставленной вами версии регулярных выражений мне удалось заставить ее работать! Единственное, что мне нужно было сделать str() , это обойти urlSoup в этой части, так как в противном случае я получал ошибку типа.