Соскребание веб-ссылок - PullRequest
0 голосов
/ 13 апреля 2019

Я работаю над проектом, который требует, чтобы я очистил уникальные ссылки с веб-сайта и сохранил их в файл CSV.Я прочитал довольно много материала о том, как это сделать, я посмотрел видео, провел тренинги по Pluralsight и LinkedIn Learning, и у меня в основном есть такая ситуация, чтобы выяснить, есть один аспект задания, в котором я не уверенкак это сделать.

Предполагается, что программа очищает веб-ссылки как от данного Домена (см. код ниже), так и от любых веб-ссылок вне домена.

import bs4 as bs
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse

BASE_url = urllib.request.urlopen("https://www.census.gov/programs-surveys/popest.html").read()
soup = bs.BeautifulSoup(BASE_url, "html.parser")

filename = "C996JamieCooperTask1.csv"
file = open(filename, "w")
headers = "WebLinks as of 4/7/2019\n"
file.write(headers)

all_Weblinks = soup.find_all('a')

url_set = set()

def clean_links(tags, base_url):
    cleaned_links = set()
    for tag in tags:
        link = tag.get('href')

        if link is None:
            continue

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

        full_urls = urllib.parse.urljoin(base_url, link)
        cleaned_links.add(full_urls)
    return cleaned_links

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

cleaned_links = clean_links(all_Weblinks, baseURL)

for link in cleaned_links:
    file.write(str(link) + '\n')

print ("URI's written to .CSV File")

КодРаботает со всеми веб-ссылками, которые являются внутренними по отношению к baseURL, поэтому существуют на этом веб-сайте, но не захватывают ни одной ссылки, внешней по отношению к сайту.Я знаю, что ответ должен быть чем-то простым, но после работы над этим проектом в течение некоторого времени я просто не могу понять, что с ним не так, поэтому, пожалуйста, помогите мне.

1 Ответ

1 голос
/ 13 апреля 2019

Вы можете попробовать селектор, такой как следующий, внутри набора понимания. Это ищет элементы тега a с href, который начинается с http или /. Это отправная точка, которую вы можете адаптировать. Вам потребуется больше логики, потому что есть хотя бы один URL, который просто / сам по себе.

links = {item['href'] for item in soup.select('a[href^=http], a[href^="/"]')}

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

...