使用Python 3进行Webscrapping

时间:2019-10-31 00:32:41

标签: python html web-scraping

在抓取网站后,我已检索到所有html链接。将它们设置为set()后,要删除所有重复项,我仍在检索某些值。 如何删除“#”,“#content”,“#uscb-nav-skip-header”,  '/',无,来自链接集。

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 个答案:

答案 0 :(得分:1)

URL中的字符#(及其后的所有字符)与浏览器相关,但在进行Web请求时与服务器无关,因此可以从URL中删除这些部分。这样会将'#content'之类的URL留空,但实际上将'/about#contact'更改为'/about',这正是您想要的。从那里开始,我们只需要一个if语句即可将非空字符串添加到集合中。这也会同时滤除None

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

如果您特别想排除'/'(尽管它是有效的URL),则只需在末尾写上lst2.discard('/')。由于lst2是一个集合,因此如果存在则将其删除,否则将不执行任何操作。

答案 1 :(得分:0)

您可以遍历集合并使用正则表达式过滤集合中的每个元素。对于“无”,您可以简单地检查值是否为“无”。

答案 2 :(得分:0)

尝试以下操作:

set(link.get('href') for link in soup.findAll(name='link') if link.has_attr("href"))

答案 3 :(得分:0)

您可以使用列表理解:

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

答案 4 :(得分:0)

您可以检查html并使用:not(bs4 4.7.1+)根据其值过滤掉各种href并对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)