Después de raspar un sitio web, he recuperado todos los enlaces html. Después de configurarlos en un conjunto (), para eliminar cualquier duplicado, todavía estoy recuperando ciertos valores. ¿Cómo elimino los valores de '#', '#content', '# uscb-nav-skip-header', '/', None, del conjunto de enlaces?

from bs4 import BeautifulSoup
import urllib
import re

#Gets the html code for scrapping
r = urllib.request.urlopen('https://www.census.gov/programs-surveys/popest.html').read()

#Creates a beautifulsoup object to run
soup = BeautifulSoup(r, 'html.parser')

#Set removes duplicates
lst2 = set()
for link in soup.find_all('a'):
    lst2.add(link.get('href'))
lst2

{'#',
 '#content',
 '#uscb-nav-skip-header',
 '/',
 '/data/tables/time-series/demo/popest/pre-1980-county.html',
 '/data/tables/time-series/demo/popest/pre-1980-national.html',
 '/data/tables/time-series/demo/popest/pre-1980-state.html',
 '/en.html',
 '/library/publications/2010/demo/p25-1138.html',
 '/library/publications/2010/demo/p25-1139.html',
 '/library/publications/2015/demo/p25-1142.html',
 '/programs-surveys/popest/data.html',
 '/programs-surveys/popest/data/tables.html',
 '/programs-surveys/popest/geographies.html',
 '/programs-surveys/popest/guidance-geographies.html',
 None,
 'https://twitter.com/uscensusbureau',
 ...}
0
Marcon Fikingas 31 oct. 2019 a las 03:32

5 respuestas

La mejor respuesta

El carácter # (y todo lo que sigue) en una URL es relevante para un navegador, pero no para el servidor cuando se realiza una solicitud web, por lo que está bien cortar esas partes de las URL. Esto dejará las URL como '#content' en blanco, pero también cambiará '/about#contact' a solo '/about', que es lo que realmente quieres. A partir de ahí, solo necesitamos una instrucción if para agregar solo las cadenas no vacías al conjunto. Esto también filtrará None al mismo tiempo:

lst2 = set()
for link in soup.find_all('a'):
    url = link.get('href')
    url = url.split('#')[0]
    if url:
        lst2.add(url)

Si desea excluir específicamente '/' (aunque es una URL válida), simplemente puede escribir lst2.discard('/') al final. Como lst2 es un conjunto, esto lo eliminará si está allí o no hará nada si no lo está.

1
kaya3 31 oct. 2019 a las 00:39

Puede examinar el html y usar: not (bs4 4.7.1+) para filtrar varios href en función de sus valores y aplicar una prueba final sobre la longitud de href

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.census.gov/programs-surveys/popest.html')
soup = bs(r.content, 'lxml')
links = [i['href'] for i in soup.select('a[href]:not([class*="-nav-"],[class*="-pagination-"])') if len(i['href']) > 1]
print(links)
0
QHarr 31 oct. 2019 a las 00:46

Pruebe con lo siguiente:

set(link.get('href') for link in soup.findAll(name='link') if link.has_attr("href"))
0
game0ver 31 oct. 2019 a las 00:38

Puedes usar la comprensión de la lista:

new_set = [link if '#' not in link for link in lst2 ]

0
paltaa 31 oct. 2019 a las 00:42

Puede recorrer su conjunto y utilizar expresiones regulares para filtrar cada elemento en el conjunto. Para Ninguno, simplemente puede verificar si el valor es Ninguno o no.

0
ooi18 31 oct. 2019 a las 00:37