【发布时间】: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