抓网时如何排除元组?

时间:2019-10-07 13:56:37

标签: python beautifulsoup

当我运行这段代码时,我会得到一个包含所有正确信息的列表。这样行得通,但是我也从排除列表中得到了这些单词。

有什么办法可以从输出中删除排他列表中的所有单词?

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

2 个答案:

答案 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()