Python 使用列表搜索字符串并返回多个单词变量。

Python 使用列表搜索字符串并返回多个单词变量。,python,python-3.x,pandas,beautifulsoup,urllib,Python,Python 3.x,Pandas,Beautifulsoup,Urllib,代码如下 解释我在做什么:我有一个关键字列表。我需要确定这些关键字是否出现在任何给定的网页上(我输入)。我遇到的问题是关键字超过两个词。例如,如果您查看下面的结果,您将看到“星球大战”和“战争”不会出现在列表中。“星球大战”是我的关键词列表中的一个短语,我需要结果显示为“星球大战”,而不是两个单独的项目。目前,我将bs4中的文本转换为一个字符串,然后转换为一个列表,我知道这是不正确的,因为它是基于“”分隔的,默认情况下,它将分割我正在搜索的短语。有没有办法直接在字符串中搜索导入列表中存在的短语

代码如下

解释我在做什么:我有一个关键字列表。我需要确定这些关键字是否出现在任何给定的网页上(我输入)。我遇到的问题是关键字超过两个词。例如,如果您查看下面的结果,您将看到“星球大战”和“战争”不会出现在列表中。“星球大战”是我的关键词列表中的一个短语,我需要结果显示为“星球大战”,而不是两个单独的项目。目前,我将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']]
请求输入,因此下面是我将看到的网页中的文本示例(这是一个字符串):

影迷们逐渐远离了《星球大战》和《星际迷航》等怀旧电影。新一代更喜欢具有现代特效和CGI(如《阿凡达》)的电影

在这种情况下,《星球大战》和《星际迷航》将成为mylist中的关键词。但是,它们不会显示在结果中,因为它们是两个单词变量

目前,我已经设置了将html文本字符串拆分为列表的代码。这适用于单片名电影,但不适用于包含多个单词的电影片名。这是我试图解决的主要问题。我知道拆分字符串将不允许我将标题与多个单词相交

有没有办法直接在字符串中搜索导入列表中存在的短语

是,使用中的
操作符

>>> ' bar ' in 'foo bar baz'
True
您会注意到,这里我在搜索词周围加了空格,以防止出现此类问题:

>>> 'bar' in 'the barren wasteland'
True

文本开头和结尾的单词仍然有问题。您可以在文本中添加空格来解决这个问题,或者您可以开始研究正则表达式。

使用正则表达式可以实现简单的目标

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

请将标题更改为对问题的解释。一些实际输入会很好地显示出来。或者至少显示
gettext
的类型,并解释为什么要
str(gettext)
搜索正则表达式更为通用,在这里实际可以使用。如何使用列表执行此操作,然后让它返回匹配的单词列表?所以,澄清一下,在你的例子中,bar是一个列表,foo-bar-baz是一个字符串。@Madpysicator同意(这就是我提到它的原因),但它也是一个更复杂的解决方案,并不是所有情况下都需要它。当前问题的最简单解决方案通常是最佳选项。@bdubs编写一个循环,循环遍历搜索项列表,并跟踪匹配项。