Функция для этих элементов разбора не будет повторяться. BeautifulSoup - PullRequest
1 голос
/ 23 октября 2019

Какая функция (или т. Д.) Идеальна, чтобы эти псевдонимы не повторялись в моем парсере. Не знаю, как это сделать. Буду очень признателен, если вы мне поможете.

Источник:

from urllib.request import urlopen as uReq
from urllib.request import Request
from bs4 import BeautifulSoup as soup

# save all the nicknames to 'CSV' file format
filename = "BattlePassNicknames.csv"
f = open(filename, "a", encoding="utf-8")
headers1 = "Member of JAZE Battle Pass 2019\n"
b = 1
if b < 2:
    f.write(headers1)
    b += 1
# start page
i = 1
while True:
    # disable jaze guard. turn off html 'mod_security'
    link = 'https://jaze.ru/forum/topic?id=50&page='+str(i)
    my_url = Request(
        link,
        headers={'User-Agent': 'Mozilla/5.0'}
    )
    i += 1  # increment page no for next run
    uClient = uReq(my_url)
    if uClient.url != link:
        break
    page_html = uClient.read()
    # Check if there was a redirect
    uClient.close()
    # html parsing
    page_soup = soup(page_html, "html.parser")
    # grabs each name of player
    containers = page_soup.findAll("div", {"class": "top-area"})

    for container in containers:
        playerName = container.div.a.text.strip()
        print("BattlePass PlayerName: " + playerName)
        f.write(playerName + "\n")

1 Ответ

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

Вы можете добавить все имена в набор .

Объект set представляет собой неупорядоченную коллекцию различных хешируемых объектов. Обычное использование включает тестирование членства, удаление дубликатов из последовательности и вычисление математических операций, таких как пересечение, объединение, разность и симметричная разность.

my_set = set()
# Lets add some elements to a set
my_set.add('a')
my_set.add('b')
print(my_set)  # prints {'a', 'b'}
# Add one more 'a'
my_set.add('a')
print(my_set) # still prints {'a', 'b'} !

В вашем случае давайте добавим все имена в набор, а затем запишем в файл после цикла for.

from urllib.request import urlopen as uReq
from urllib.request import Request
from bs4 import BeautifulSoup as soup

# save all the nicknames to 'CSV' file format
filename = "BattlePassNicknames.csv"
f = open(filename, "a", encoding="utf-8")
headers1 = "Member of JAZE Battle Pass 2019\n"
b = 1
if b < 2:
    f.write(headers1)
    b += 1
# start page
i = 1
names = set()
while True:
    # disable jaze guard. turn off html 'mod_security'
    link = 'https://jaze.ru/forum/topic?id=50&page='+str(i)
    my_url = Request(
        link,
        headers={'User-Agent': 'Mozilla/5.0'}
    )
    i += 1  # increment page no for next run
    uClient = uReq(my_url)
    if uClient.url != link:
        break
    page_html = uClient.read()
    # Check if there was a redirect
    uClient.close()
    # html parsing
    page_soup = soup(page_html, "html.parser")
    # grabs each name of player
    containers = page_soup.findAll("div", {"class": "top-area"})

    for container in containers:
        playerName = container.div.a.text.strip()
        names.add(playerName)

for name in names:
    f.write(name + "\n")
f.close()

EDIT

Наборы не сохраняют порядок. Если вы хотите сохранить порядок, просто используйте списки.

...
names = []
while True:
...
    for container in containers:
        playerName = container.div.a.text.strip()
        if playerName not in names:
            names.append(playerName)

for name in names:
    f.write(name + "\n")
f.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...