【问题标题】:Scraping unique links from website with Python only retrieving 1 link使用 Python 从网站上抓取唯一链接仅检索 1 个链接
【发布时间】:2021-02-09 18:20:12
【问题描述】:

我正在尝试仅从网站上抓取唯一的 url,并将它们作为绝对链接写入文件。 当我最初抓取网站时,我检索到 253 个链接。但是,当我使用 set() 仅检索唯一链接并使用代码将它们转换为绝对链接时,它只返回 1 个 url。我玩弄了它并删除了可能导致它的函数 unique_urls ,但它做了同样的事情。我是 Python 新手,仍然掌握循环,所以它很容易成为我忽略的东西。有任何想法吗?谢谢。

import bs4
import requests
from bs4 import BeautifulSoup, SoupStrainer
import csv

url = "https://www.census.gov/programs-surveys/popest.html"
r = requests.get(url)
raw_html = r.text
soup = BeautifulSoup(raw_html, 'html.parser')
results = soup.find_all("a")

print ('Number of links retrieved: ', len (results))

def unique_urls(tags,url):
    cleaned_urls = str(link.get("href"))

for link in results:
    link = link.get("href")
    if link.startswith('/'):
        cleaned_urls.add('https://www.census.gov' + hrefs)
    elif link.startswith('#'):
        cleaned_urls.add(hrefs)
    else: 
        unique_urls.add(cleaned_urls)

print ('Number of links retrieved: ', len )

【问题讨论】:

  • 在添加set()之前你有253个链接,之后它只返回1个,当你删除set()回到你第一次拥有的时候,仍然只有1个结果?我理解正确吗?你能提供一个minimal reproducible example吗?
  • 不,抱歉。当我删除 unique_urls 函数时。我认识的人建议我尝试不使用该功能,但我仍然使用 set 方法。不确定这是否有意义。当我回到家时,我可以发布一个例子。谢谢。
  • 我不理解unique_urls() 函数,它有两个未使用的参数,但确实使用了一个似乎没有在任何地方定义的变量。这里的函数似乎都没有返回任何东西,最好重构代码以获取和返回值,而不是弄乱全局变量。
  • 另外,你如何定义你感兴趣的链接?

标签: python web-scraping


【解决方案1】:

使用以下代码获取唯一网址

import bs4
import requests
from bs4 import BeautifulSoup, SoupStrainer
import csv
import re

url = "https://www.census.gov/programs-surveys/popest.html"
r = requests.get(url)
raw_html = r.text
soup = BeautifulSoup(raw_html, 'html.parser')
results = soup.find_all("a")

print('Number of links retrieved: ', len(results))

list_urls = []
for link in results:
    link = link.get("href")
    if link is None or link == "#content":
        pass
    else:
        if re.match(r"https://", link):
            list_urls.append(link)
print("******* total urls*********")
print("total count of urls: ", len(list_urls))
print("*********** after unique*****")
unique_urls = set(list_urls)
print("length of unique urls:", len(set(list_urls)))

【讨论】:

  • 我浏览了 csv 文件,我想我应该得到 122 个链接,但只有 92 个出现。
【解决方案2】:

这是您需要的吗?我实际上只得到了 92 个有效且唯一的 URL。

import bs4
import requests
from bs4 import BeautifulSoup, SoupStrainer
import csv
from functools import partial  
from operator import is_not


import re

filter_null = partial(filter, partial(is_not, None))

checklink = []

url = "https://www.census.gov/programs-surveys/popest.html"
r = requests.get(url)
raw_html = r.text
soup = BeautifulSoup(raw_html, 'html.parser')
results = soup.find_all("a")

print ('Number of links retrieved: ', len (results))

for result in results:

    checklink.append(result.get('href'))
    L =list(filter_null(checklink))

    regex = re.compile(r'http')

    selected_files = list(filter(regex.match, L))
distinctTitle  = (list(set(selected_files)))

#def unique_urls(tags,url):
#    cleaned_urls = str(link.get("href"))
#
#for link in results:
#    link = link.get("href")
#    if link.startswith('/'):
#        cleaned_urls.add('https://www.census.gov' + hrefs)
#    elif link.startswith('#'):
#        cleaned_urls.add(hrefs)
#    else: 
#        unique_urls.add(cleaned_urls)

print ('Number of Unique and cleaned links retrieved: ', len(distinctTitle))

【讨论】:

  • 我自己写了一个解决方案,找到了122个链接。你能分享一下你得到的结果吗?
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
相关资源
最近更新 更多