当我运行这段代码时,我会得到一个包含所有正确信息的列表。这样行得通,但是我也从排除列表中得到了这些单词。
有什么办法可以从输出中删除排他列表中的所有单词?
from bs4 import BeautifulSoup
url = 'https://www.finn.no/bap/forsale/search.html?category=0.93&product_category=2.93.3904.69&sub_category=1.93.3904'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
exclude = ('UTLEIE', 'Utleie', 'utleie', 'NIKON', 'Nikon', 'nikon' 'Leica', 'LEICA', 'leica', 'sony', 'SONY', 'Sony', 'Pentax', 'PENTAX', 'pentax', 'RF', 'iphone', 'android', 'Magic', 'MAGIC', 'magic')
def check_status(func):
def verify(*args, **kwargs):
if page.status_code != 200:
return f'Error code: {page.status_code}'
return func(*args, **kwargs)
return verify
@check_status
def scrape_website():
for i in soup.find_all('article', {'class': 'ads__unit'}):
for j in i.find('a', {'class': 'ads__unit__link'}):
if any(s not in j.strip().lower() for s in exclude):
print(j.strip())
scrape_website()
#---------------------------------------------------------------------------#
[Running] python -u "h:\webscrapfinn\tempCodeRunnerFile.py"
Canon efs 17-55 mm
Canon EF 50mm f/1.2L USM
Linser til mobiltelefon
Ricoh 50 mm f2 for Pentax speireflex, og Pentax til Sony E converter
nikon 14-24mm
TIL UTLEIE - Sigma 50mm 1.4 Art
Olympus M.Zuiko ED 14-150mm f/4-5.6
Sony 16-35mm F4
TIL UTLEIE - Canon 16-35mm F4 IS
Nikon 20mm 1.8
Fujinon 55-200mm
答案 0 :(得分:1)
您写道:
if any(s not in j.strip().lower() for s in exclude):
print(j.strip())
这是说“如果我的黑名单中的任何单词不在当前标签中,请打印标签”。按照这种逻辑,只有当所有列入黑名单的单词都出现在标签中时,标签才会打印出来。
我可能会这样写:
if any(s in j.strip().lower() for s in exclude):
continue
print(j.strip())
注意:打印语句不在if语句中,但仍在内部for循环中。这样,只要您的黑名单中的任何一个单词出现在当前标签中,您就可以跳过当前标签并移至下一个。
答案 1 :(得分:0)
编辑:所以'j'是来自webscraper模块的单词字符串,因此您需要将它们转换为单词列表,以检查是否有任何单词属于排除列表。
在比较之前,您还需要“降低”排除列表中的所有单词。 创建一个列表,并将其转换为列表中的小写单词。
将这两个列表都转换为集合,将为您提供使用集合操作进行比较的优势。
两者都做交集,检查是否有共同点。如果没有,请打印出来。
只需删除行:
if any(s not in j.strip().lower() for s in exclude):
并使用:
if not set(word.strip().lower().split()) & set(exclude):
基本上在代码中:
from bs4 import BeautifulSoup
import requests
url = 'https://www.finn.no/bap/forsale/search.html?category=0.93&product_category=2.93.3904.69&sub_category=1.93.3904'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
exclude = ['UTLEIE', 'Utleie', 'utleie', 'NIKON', 'Nikon', 'nikon' 'Leica', 'LEICA', 'leica', 'sony', 'SONY', 'Sony', 'Pentax', 'PENTAX', 'pentax', 'RF', 'iphone', 'android', 'Magic', 'MAGIC', 'magic']
exclude = [x.lower() for x in exclude]
def check_status(func):
def verify(*args, **kwargs):
if page.status_code != 200:
return f'Error code: {page.status_code}'
return func(*args, **kwargs)
return verify
@check_status
def scrape_website():
for i in soup.find_all('article', {'class': 'ads__unit'}):
for word in i.find('a', {'class': 'ads__unit__link'}):
if not set(word.strip().lower().split()) & set(exclude):
print(word.strip())
scrape_website()