Код ниже.
Объяснение того, что я делаю: у меня есть список ключевых слов. Мне нужно определить, присутствуют ли эти ключевые слова на какой-либо данной веб-странице (которую я ввожу). Проблема, с которой я сталкиваюсь, связана с ключевыми словами, состоящими более чем из двух слов. Например, если вы посмотрите на результаты ниже, вы увидите, что «Звезды» и «Войны» не отображаются в списке. «Звездные войны» - это фраза в моем списке ключевых слов, и мне нужно, чтобы результат отображался как «Звездные войны», а не два отдельных элемента. В настоящее время у меня есть текст из bs4, преобразующийся в строку, а затем в список, который, как я знаю, неверен, потому что он разделяется на основе «», который по умолчанию разделяет фразы, которые я ищу. Есть ли способ напрямую искать в строке фразы, содержащиеся в импортированном списке?
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import re
import pandas as pd
#Wikipedia Adress here
site= "website.html"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site,headers=hdr)
page = urlopen(req)
soup = BeautifulSoup(page,'lxml')
#Company Website Here
site = "website.html"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(site,headers=hdr)
page = urlopen(req)
soup2 = BeautifulSoup(page,'lxml')
#Extracts text from soup and saves as souptext variable
gettext = soup.get_text()
gettext2 = soup2.get_text()
#converts to string
souptext = str(gettext)
souptext2 = str(gettext2)
#converts to list
split = souptext.split(' ')
split2 = souptext2.split(' ')
#combines both splits to one single list
combined = split + split2
#combines both strings to one string
combinedstr = souptext.lower() + souptext2.lower()
#Imports Excel File containing keywords
df = pd.read_csv('Movies.csv')
#Extracts desired column variables as keywords
mylist = df['Titles'].tolist()
liststr = str(mylist)
intersection = [i for i in mylist if i in combined]
results = list()
results.append(intersection)
print(results)
[['Avatar', 'Goodfellas', 'Saw', 'Crash', 'Gladiator', 'Scarface']]
Был запрошен ввод, поэтому вот пример текста с веб-страницы, которую я бы увидел (это строка):
Поклонники кино постепенно отходят от ностальгических фильмов, таких как «Звездные войны» и «Звездный путь». Новое поколение предпочитает фильмы с современными спецэффектами и компьютерной графикой, например «Аватар».
В этом случае «Звездные войны» и «Звездный путь» будут ключевыми словами из mylist. Однако они не будут отображаться в результатах, поскольку представляют собой переменные, состоящие из двух слов.
В настоящее время у меня есть код для разделения текстовой строки html на список. Это работает для фильмов с одним заголовком, но не для заголовков фильмов, содержащих несколько слов. это основная проблема, которую я пытаюсь решить здесь. Я знаю, что разделение строки не позволит мне пересекать заголовки с несколькими словами.
Было бы неплохо увидеть некоторые фактические данные.
Или хотя бы покажите тип gettext и объясните, почему вы делаете str(gettext)






Is there a way for me to search the string directly for phrases that exist on the imported list?
Да, воспользуйтесь оператором in.
>>> ' bar ' in 'foo bar baz'
True
Вы заметите, что здесь я поставил пробелы вокруг поискового запроса, чтобы предотвратить подобные проблемы:
>>> 'bar' in 'the barren wasteland'
True
У вас по-прежнему будут проблемы со словами в начале и конце текста. Вы можете добавить в текст пробелы, чтобы решить эту проблему, или вы можете начать изучать регулярные выражения.
Поиск регулярного выражения является гораздо более общим и действительно работает здесь.
Как я могу сделать это со списком, а затем вернуть список совпадающих слов? Итак, чтобы уточнить, в вашем примере bar - это список, а foo bar baz - это строка.
@MadPhysicist Согласен (именно поэтому я упомянул об этом), но это также более сложное решение, которое требуется не во всех случаях. Самое простое решение текущей проблемы - обычно лучший вариант.
@bdubs Напишите цикл, который перебирает список условий поиска и отслеживает, какие из них совпадают.
То, что вы хотите достичь, должно быть простым с регулярным выражением.
import re
import requests
movie_list = ["batman","star wars", "star treck", "Blade Runner 2049"]
url = "https://www.imdb.com/list/ls062017175/"
response = requests.get(url)
html = response.text
movies_in_page = []
for movie in movie_list:
if len(re.findall(r"\b{}\b".format(movie),html, flags=re.I|re.M) ) >0:
movies_in_page.append(movie)
print()
print("{} Movies found in page: {}".format(len(movies_in_page),movies_in_page))
Выход
>>> 3 Movies found in page: ['batman', 'star wars', 'Blade Runner 2049']
Пожалуйста, измените заголовок на объяснение вашей проблемы.