Как очистить уникальные ссылки только с python - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь удалить только уникальные ссылки с веб-страницы, используя python, и записать URL-адреса в CSV-файл. Код, который у меня есть, очищает ссылки, но в файле есть повторяющиеся ссылки.

Например, файл csv имеет один URL-адрес дважды, а второй имеет / в самом конце. Я думал, что

if link.endswith('/'):
        link = link[-1]

удалит это, но я довольно плохо знаком с python, так что, возможно, я сделал что-то не так или неправильно что-то понял.

Но в дополнение к этому я У меня есть несколько одинаковых URL-адресов, без backsla sh или чего-то другого, и они также появляются в документе. Если я не совсем уверен в своем коде, я бы хотел больше узнать о том, как удалить эти ссылки, когда я потерян. Есть ли где-нибудь хороший учебник в Интернете, который кто-то может порекомендовать?

Или, может быть, это простое исправление, которое я пропускаю ?? Я выложу полный код ниже. Спасибо.

import requests
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse

url="https://www.census.gov/programs-surveys/popest"

r=requests.get(url)
soup= BeautifulSoup(r.content, "html.parser")

results =  soup.find_all("a")

for link in results:
link.get("href")       

def unique_urls(tags,url):
cleaned_urls = set()

for link in results:
link = link.get("href")

    if link is None:
        continue
    if link.endswith('/'):
        link = link[-1]

    actual_url = urllib.parse.urljoin(url,link)
    cleaned_urls.add(actual_url)

return cleaned_urls

print(cleaned_urls)


import csv
for link in results:
S=link.get('href')
csvRow = [S]
csvfile = "urls1.csv"
with open(csvfile, "a") as fp:
    wr = csv.writer(fp, dialect='excel')
    wr.writerow(csvRow )

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

Ссылка, которую вы пытаетесь очистить, больше не доступна, дайте нам еще одну ссылку с URL-адресами, чтобы я мог предоставить код.

В любом случае, я думаю, у вас есть 2 проблемы: удаление дубликатов из собранных данных и сохраненных эти данные в CSV.

1. удаление дубликатов из собранных данных: Когда вы получаете URL-адреса, сохраненные в списке, чтобы удалить дубликат, вам просто нужно преобразовать список, чтобы установить, а затем преобразовать его в список: список -> набор -> список

list_of_urls = ['url_1', 'url_1', 'url_2', 'url_1', 'url_1', 'url_2', 'url_3', 'url_3'] 
set_of_urls = set(list_of_urls) # return : {'url_1', 'url_2', 'url_3'}
list_clean = list(set_of_urls) # return :['url_3', 'url_1', 'url_2']

# or directly: list_clean = list(set(list_of_urls))

2. Сохраните чистые данные в CSV-файле:

Это чистый подход, шаг за шагом: предположим, что вам нужно только хранить электронную почту, это означает, что 1 столбец в нашем CSV-файле

with open('emails.csv', 'w') as csv_file:       #create a file called emails.csv and open it in write mode  / csv_file = file-like object
    w = csv.writer(csv_file, lineterminator='\n')    # create the writer(csv file), which will write rows one by one on the csv_file (Return a writer object)
    header = ['emails']   
    w.writerow(header)      # .writerow(list) : get list and add it to the table as row

    for email in list_clean : #list_clean is the list of emails already collected
        # each loop create 1 row: val1, val2 val3
        w.writerow(['email'])     #.writerow(list) each row on each loop will be added to the file (row must be an iterable of strings or numbers)

Если вы хотите сохранить свои данные в текстовом файле (1 столбец не обязательно должен быть в CSV):

with open('emails.txt', 'w') as f:
    for i in list_clean:     
        f.write("%s\n" % i)
0 голосов
/ 29 февраля 2020

Рекомендовать простую библиотеку.

import csv
from simplified_scrapy import req, SimplifiedDoc
url = 'https://www.census.gov/programs-surveys/popest'
html = req.get(url)
doc  = SimplifiedDoc(html)
lstA = doc.listA(url=url) # This is the result of de duplication
csvRow = [a.url for a in lstA]

csvfile = "urls1.csv"
with open(csvfile, "a") as fp:
  wr = csv.writer(fp, dialect='excel')
  wr.writerow(csvRow )

Вот еще примеры: https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

0 голосов
/ 29 февраля 2020

Вы правильно используете set, чтобы найти уникальные предметы. Если вы хотите поместить ваши URL-адреса в общий формат, извлеките из библиотеки [url-normalize] (https://pypi.org/project/url-normalize] . Возможно, есть и другие. Однако многие не удаляют завершающие косые черты, поскольку они могут имеет значение. Вы можете удалить последний символ с помощью link[:-1] (не link[-1]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...