#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 в этой части, так как в противном случае я получал ошибку типа.