Как я могу исключить кортеж при webscraping? - PullRequest
0 голосов
/ 07 октября 2019

Когда я запускаю этот код, я получаю список со всей необходимой информацией. Это работает, но я также получаю слова из списка исключений.

Есть ли способ удалить все слова из списка исключений из вывода?

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 ]

1 голос
/ 07 октября 2019

Вы писали:

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

Примечание. Печать-statement находится не в операторе if, но все еще во внутреннем цикле for. Таким образом, как только одно из ваших слов в черном списке появляется в текущем теге, вы пропускаете текущий тег и переходите к следующему.

0 голосов
/ 07 октября 2019

РЕДАКТИРОВАТЬ: Таким образом, '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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...