【问题标题】:How can I ensure that relative links are saved as absolute URLs in the output file?如何确保相对链接在输出文件中保存为绝对 URL?
【发布时间】:2020-02-27 14:52:14
【问题描述】:

我需要用 Python 开发一个网络链接抓取程序,该程序从“当前估计”网络链接的 HTML 代码中提取指向其他网页的所有唯一网络链接,两者都来自“美国人口普查局”网站(请参阅下面的网络链接)和该域之外,并将它们填充到逗号分隔值 (CSV) 文件中作为绝对统一资源指示符 (URI)。

我在 Jupyter Notebook 中使用下面的代码,它似乎生成了一个 CSV,但我的部分代码在已经绝对链接上生成双 https://,而它应该只是将其添加到相对链接。

http:https://www.census.gov/data/training-workshops.html

http:https://www.census.gov/programs-surveys/sis.html

我需要一个更好的代码,可以将相对链接更改为绝对链接我相信 full_url = urljoin(url, link.get("href")) 应该这样做,但有些地方不正确。

如何确保相对链接在输出文件中保存为绝对 URL?

import requests

from bs4 import BeautifulSoup, SoupStrainer

import csv

from urllib.parse import urljoin

import re


url = 'https://www.census.gov/programs-surveys/popest.html'

r = requests.get(url)


raw_html = r.text

print(r.text)


soup = BeautifulSoup(raw_html, 'html.parser')

print(soup.prettify())


for link in soup.find_all('a',href=True):

  full_url = urljoin(url, link.get("href"))

  print(link.get('href'))


links_set = set()

for link in soup.find_all(href=re.compile('a')):

  print(link.get('href'))


for item in soup.find_all('a',href=re.compile(r'html')):

  links_set.add(item.get('href'))

  links = [x[:1]=='http' and x or 'http:'+x for x in links_set]


with open("C996FinalAssignment.csv", "w") as csv_file:

  writer = csv.writer(csv_file,delimiter="\n")

  writer.writerow(links)

【问题讨论】:

  • 您需要解决links = [x[:1]=='http' and x or 'http:'+x for x in links_set]这一行。如果您在将其编写为列表理解时遇到问题,只需遍历 links_set 并调整需要调整的那些。

标签: python-3.x anaconda jupyter


【解决方案1】:

试试这个。

import requests
import csv
from simplified_scrapy.simplified_doc import SimplifiedDoc
url = 'https://www.census.gov/programs-surveys/popest.html'
r = requests.get(url)
raw_html = r.text
print(r.text)
doc  = SimplifiedDoc(raw_html)
lstA = doc.listA(url=url) # It will help you turn relative links into absolute links
links = [a.url for a in lstA]
with open("C996FinalAssignment.csv", "w") as csv_file:
  writer = csv.writer(csv_file,delimiter="\n")
  writer.writerow(links)

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 2021-11-29
    • 2015-08-26
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2022-11-16
    • 2010-10-07
    相关资源
    最近更新 更多