Поиск строки с использованием списка и возврат многословных переменных

Код ниже.

Объяснение того, что я делаю: у меня есть список ключевых слов. Мне нужно определить, присутствуют ли эти ключевые слова на какой-либо данной веб-странице (которую я ввожу). Проблема, с которой я сталкиваюсь, связана с ключевыми словами, состоящими более чем из двух слов. Например, если вы посмотрите на результаты ниже, вы увидите, что «Звезды» и «Войны» не отображаются в списке. «Звездные войны» - это фраза в моем списке ключевых слов, и мне нужно, чтобы результат отображался как «Звездные войны», а не два отдельных элемента. В настоящее время у меня есть текст из 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 на список. Это работает для фильмов с одним заголовком, но не для заголовков фильмов, содержащих несколько слов. это основная проблема, которую я пытаюсь решить здесь. Я знаю, что разделение строки не позволит мне пересекать заголовки с несколькими словами.

Пожалуйста, измените заголовок на объяснение вашей проблемы.

Mad Physicist 14.08.2018 19:31

Было бы неплохо увидеть некоторые фактические данные.

Mad Physicist 14.08.2018 19:32

Или хотя бы покажите тип gettext и объясните, почему вы делаете str(gettext)

Mad Physicist 14.08.2018 19:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
78
2

Ответы 2

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

У вас по-прежнему будут проблемы со словами в начале и конце текста. Вы можете добавить в текст пробелы, чтобы решить эту проблему, или вы можете начать изучать регулярные выражения.

Поиск регулярного выражения является гораздо более общим и действительно работает здесь.

Mad Physicist 14.08.2018 19:34

Как я могу сделать это со списком, а затем вернуть список совпадающих слов? Итак, чтобы уточнить, в вашем примере bar - это список, а foo bar baz - это строка.

bdubs 14.08.2018 19:42

@MadPhysicist Согласен (именно поэтому я упомянул об этом), но это также более сложное решение, которое требуется не во всех случаях. Самое простое решение текущей проблемы - обычно лучший вариант.

Xiong Chiamiov 21.08.2018 22:12

@bdubs Напишите цикл, который перебирает список условий поиска и отслеживает, какие из них совпадают.

Xiong Chiamiov 21.08.2018 22:12

То, что вы хотите достичь, должно быть простым с регулярным выражением.

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']

Другие вопросы по теме