【问题标题】:Converting variables into lists and removing duplicates将变量转换为列表并删除重复项
【发布时间】:2019-10-11 21:20:38
【问题描述】:

我使用以下代码抓取了一个网站。

网站以某种方式构建,需要使用 4 个不同的类来抓取所有数据,这会导致某些数据重复。

为了将我的变量转换为列表,我尝试使用 split(' ') 方法,但它只为每个 scraped 字符串创建了一个列表,其中 /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_scraper.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()




    

【问题讨论】:

  • 如果您制作了包含重复数据的数据类型、结构等样本,将会很有帮助。 (一个最小的、示范性的例子)。这里的一般技术只是制作一组你拥有的任何东西,这将删除真正的重复。
  • 我不确定我是否理解正确,您希望我提供我的最终数据样本吗?确实如此,所以我不确定是否有必要,因为只是认为我从网站上获得的行数很少,每次 2-3 次

标签: html python-3.x web-scraping beautifulsoup duplicates


【解决方案1】:

如果不是因为 api 链接,我会说只使用 pandas read_html 并获取索引 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]

然后使用上面显示的选择器从 bs4 中为 api_links 添加额外的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多