Преобразование переменных в списки и удаление дубликатов - PullRequest
0 голосов
/ 25 мая 2019

Я удалил сайт, используя приведенный ниже код.

Веб-сайт структурирован определенным образом, который требует использования 4 различных классов для очистки всех данных, что приводит к дублированию некоторых данных.

Для преобразования моих переменных в списки я попытался использовать метод split (''), но он только создавал список для каждой записанной строки с / n в начале. Я также пытался создать переменную в виде пустых списков, например, api_name = [], но она не сработала.

Для удаления дубликатов я думал об использовании метода set, но я думаю, что он работает только со списками.

Я хочу удалить все дублированные данные из моих переменных перед тем, как записать их в файл CSV, нужно ли сначала конвертировать их в списки или есть способ удалить их непосредственно из переменных?

Буду признателен за любую помощь или даже обратную связь для кода.

Спасибо.

import requests
from bs4 import BeautifulSoup
import csv

url = "https://www.programmableweb.com/apis/directory"
api_no = 0
urlnumber = 0

response = requests.get(url)
data = response.text
soup = BeautifulSoup(data, "html.parser")

csv_file = open('api_scrapper.csv', 'w')
csv_writer = csv.writer(csv_file)
csv_writer.writerow(['api_no', 'API Name', 'Description','api_url', 'Category', 'Submitted'])

#THis is the place where I parse and combine all the classes, which causes the duplicates data
directories1 = soup.find_all('tr', {'class': 'odd'})
directories2 = soup.find_all('tr', {'class': 'even'})
directories3 = soup.find_all('tr', {'class': 'odd views-row-first'})
directories4 = soup.find_all('tr', {'class': 'odd views-row-last'})
directories = directories1 + directories2 + directories3 + directories4

while urlnumber <= 765:
    for directory in directories:
        api_NameTag = directory.find('td', {'class':'views-field views-field-title col-md-3'})
        api_name = api_NameTag.text if api_NameTag else "N/A"

        description_nametag = directory.find('td', {'class': 'col-md-8'})
        description = description_nametag.text if description_nametag else 'N/A'

        api_url = 'https://www.programmableweb.com'  + api_NameTag.a.get('href')

        category_nametage = directory.find('td',{'class': 'views-field views-field-field-article-primary-category'})
        category = category_nametage.text if category_nametage else 'N/A'

        submitted_nametag = directory.find('td', {'class':'views-field views-field-created'})
        submitted = submitted_nametag.text if submitted_nametag else 'N/A'

#These are the variables I want to remove the duplicates from
        csv_writer.writerow([api_no,api_name,description,api_url,category,submitted])

        api_no +=1

    urlnumber +=1
    url = "https://www.programmableweb.com/apis/directory?page=" + str(urlnumber)

csv_file.close()

1 Ответ

1 голос
/ 25 мая 2019

Если бы не ссылки на API, я бы сказал, просто используйте pandas read_html и возьмите index 2. Как вы хотите, URL-адреса, а также я предлагаю вам изменить ваши селекторы. Вы хотите ограничиться таблицей, чтобы избежать дубликатов и выбрать имя класса, который изображает столбец.

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.programmableweb.com/apis/directory')
soup = bs(r.content, 'lxml')
api_names, api_links = zip(*[(item.text, 'https://www.programmableweb.com'  + item['href']) for item in soup.select('.table .views-field-title a')])
descriptions = [item.text for item in soup.select('td.views-field-search-api-excerpt')]
categories = [item.text for item in soup.select('td.views-field-field-article-primary-category a')]
submitted = [item.text for item in soup.select('td.views-field-created')]
df = pd.DataFrame(list(zip(api_names, api_links, descriptions, categories, submitted)), columns = ['API name','API Link', 'Description', 'Category', 'Submitted'])
print(df)

Хотя вы могли бы просто сделать

pd.read_html(url)[2]

, а затем добавьте дополнительный столбец для api_links из bs4, используя селекторы, показанные выше.

...