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',
...}
5 respuestas
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á.
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)
Pruebe con lo siguiente:
set(link.get('href') for link in soup.findAll(name='link') if link.has_attr("href"))
Puedes usar la comprensión de la lista:
new_set = [link if '#' not in link for link in lst2 ]
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.
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.