PHP
Python

Trang chủ

Hướng dẫn sử dụng, sửa lỗi và xử lý URL trong Python chi tiết

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
18/03/2025
17 phút đọc
Theo dõi Vietnix trên

Hướng dẫn sử dụng, sửa lỗi và xử lý URL trong Python chi tiết

Xử lý URL trong Python là quá trình phân tích, thao tác và truy xuất dữ liệu từ đường dẫn web. Điều này giúp bạn trích xuất thông tin, gửi request hoặc xây dựng URL một cách linh hoạt và chính xác. Trong bài viết này, mình sẽ hướng dẫn bạn cách làm việc với URL bằng thư viện urllib.parseurllib.request, từ việc phân tích URL, gửi request đến xử lý lỗi phổ biến. Nếu bạn đang tìm kiếm giải pháp tối ưu khi thao tác với URL trong Python, bài viết này chắc chắn sẽ hữu ích.

Điểm chính cần nắm

  • Quá trình xử lý URL trong Python như thế nào?: Giới thiệu tổng quan về cách làm việc với URL trong Python, bao gồm phân tích, tạo, gửi request và xử lý lỗi.
  • Xử lý URL với urllib.parse: Sử dụng urllib.parse để phân tích, tách query string, ghép URL từ các thành phần.
  • Xử lý URL bằng urllib.request: Dùng urllib.request để đọc nội dung từ URL, gửi request GET/POST và thêm headers.
  • Sửa lỗi thường gặp khi làm việc với URL trong Python: Các lỗi phổ biến như URLError, HTTPError khi làm việc với URL và cách xử lý.
  • Vietnix – Giải pháp lưu trữ tốc độ cao, bảo mật vững chắc: Giới thiệu về dịch vụ máy chủ của Vietnix, giúp tối ưu hiệu suất và bảo mật khi triển khai ứng dụng web.
  • FAQ: Giải đáp các câu hỏi thường gặp khi xử lý URL trong Python.

Quá trình xử lý URL trong Python như thế nào?

Quá trình xử lý URL trong Python bao gồm việc phân tích, chỉnh sửa, truy xuất dữ liệu và quản lý lỗi liên quan đến URL. Python hỗ trợ xử lý URL thông qua thư viện urllib, bao gồm các module như urllib.parse để phân tích URL, urllib.request để gửi yêu cầu HTTP đến URL, urllib.error để xử lý lỗi và urllib.robotparser để làm việc với file robots.txt.

Trong môi trường Internet, các tài nguyên được xác định bằng URL (Uniform Resource Locators). Thư viện tiêu chuẩn của Python bao gồm gói urllib, cung cấp các công cụ hỗ trợ phân tích URL, lấy nội dung web và quản lý lỗi.

Quá trình xử lý URL trong Python
Quá trình xử lý URL trong Python

Các module trong urllib hỗ trợ xử lý URL

Gói urllib bao gồm các module chính sau:

  • urllib.parse: Hỗ trợ phân tích URL thành các thành phần riêng lẻ.
  • urllib.request: Chứa các hàm để mở và đọc dữ liệu từ URL.
  • urllib.error: Xử lý các ngoại lệ được tạo ra bởi urllib.request.
  • urllib.robotparser: Giúp phân tích file robots.txt.

Xử lý URL với urllib.parse

urllib.parse là một module trong thư viện urllib của Python, cung cấp các công cụ để phân tích, tạo và chỉnh sửa URL. Module này giúp tách URL thành các thành phần riêng biệt, chuyển đổi giữa các định dạng URL khác nhau và trích xuất dữ liệu từ query string.

Các hàm quan trọng trong urllib.parse

  • urlencode(query_dict) – Mã hóa dictionary thành query string để sử dụng trong URL.
  • urlparse(url) – Phân tích URL thành sáu thành phần: scheme, netloc, path, params, queryfragment.
  • urlsplit(url) – Tương tự urlparse(), nhưng không tách params khỏi path.
  • urlunparse(parts) – Kết hợp các thành phần của URL thành một chuỗi hoàn chỉnh.
  • urlunsplit(parts) – Kết hợp các thành phần URL theo cấu trúc của urlsplit().
  • parse_qs(query) – Chuyển đổi query string thành dictionary chứa các tham số.

Phân tích, xử lý URL bằng urlparse(urlstring)

Hàm urlparse(urlstring) trong module urllib.parse được sử dụng để phân tích một URL thành các thành phần riêng biệt. Kết quả trả về là một named tuple gồm sáu phần:

Thuộc tínhChỉ mụcÝ nghĩa
scheme0Giao thức của URL (HTTP, HTTPS, FTP,…)
netloc1Tên miền hoặc địa chỉ IPport (nếu có)
path2Đường dẫn trên máy chủ
params3Tham số của phần path
query4Chuỗi truy vấn (query string)
fragment5Phần định danh trong URL

Ngoài ra, đối tượng trả về còn cung cấp các thuộc tính bổ sung như username, password, hostnameport.

Cú pháp:

from urllib.parse import urlparse

parsed_url = urlparse(urlstring)

Ví dụ:

from urllib.parse import urlparse

url = "https://vietnix.vn/employees/name/?salary>=25000"
parsed_url = urlparse(url)

print("Scheme:", parsed_url.scheme)      # Output: https
print("Netloc:", parsed_url.netloc)      # Output: vietnix.vn
print("Path:", parsed_url.path)          # Output: /employees/name/
print("Params:", parsed_url.params)      # Output: (rỗng)
print("Query string:", parsed_url.query) # Output: salary>=25000
print("Fragment:", parsed_url.fragment)  # Output: (rỗng)

Giải thích

  • scheme: Giao thức của URL (ví dụ: http, https, ftp…)
  • netloc: Tên miền hoặc địa chỉ máy chủ
  • path: Đường dẫn trên máy chủ
  • params: Tham số của phần path
  • query: Chuỗi truy vấn, thường chứa các tham số trong URL
  • fragment: Phần neo, thường được dùng để di chuyển đến một vị trí cụ thể trên trang web

Kết quả:

Scheme: https
Netloc: vietnix.vn
Path: /employees/name/
Params:
Query string: salary>=25000
Fragment:

Tách query string với parse_qs(qs)

Hàm parse_qs(qs) trong module urllib.parse được sử dụng để phân tích query string trong URL và chuyển đổi nó thành một dictionary. Mỗi tham số trong query string sẽ trở thành một key trong dictionary, còn giá trị tương ứng sẽ được lưu dưới dạng danh sách.

Cú pháp:

from urllib.parse import parse_qs

parsed_query = parse_qs(qs)

Ví dụ:

from urllib.parse import urlparse, parse_qs

url = "https://vietnix.vn/search?category=server&price=1000&price=2000"
parsed_url = urlparse(url)
query_string = parsed_url.query
parsed_query = parse_qs(query_string)

print("Query String:", query_string)
print("Parsed Query:", parsed_query)

Giải thích

  • query_string: Chứa toàn bộ phần query string của URL.
  • parse_qs(query_string): Chuyển đổi query string thành dictionary, trong đó:
    • Key là tên tham số trong query string.
    • Value là danh sách chứa giá trị của tham số đó.

Kết quả:

Query String: category=server&price=1000&price=2000
Parsed Query: {‘category’: [‘server’], ‘price’: [‘1000’, ‘2000’]}

Ở ví dụ trên, tham số price xuất hiện hai lần trong query string, nên parse_qs() sẽ lưu giá trị của nó dưới dạng danh sách ['1000', '2000']. Nếu một tham số chỉ xuất hiện một lần, danh sách chỉ chứa một phần tử.

Ghép URL từ các thành phần với urlunparse()urlunsplit()

Trong module urllib.parse, hai hàm urlunparse()urlunsplit() giúp kết hợp các thành phần URL thành một chuỗi hoàn chỉnh.

  • urlunparse(parts): Ghép 6 thành phần của URL (scheme, netloc, path, params, query, fragment) thành một URL đầy đủ.
  • urlunsplit(parts): Tương tự urlunparse(), nhưng chỉ ghép 5 thành phần (scheme, netloc, path, query, fragment), bỏ qua params.

Cú pháp:

from urllib.parse import urlunparse, urlunsplit

urlunparse(parts)

Hàm này là đối nghịch của hàm urlparse(), tạo một URL từ một bộ dữ liệu (tuple) được trả về bởi urlparse(). Đối số parts có thể là bất kỳ bộ dữ liệu sáu phần tử nào. Hàm này trả về một URL tương đương.

Ví dụ sử dụng urlunparse():

from urllib.parse import urlunparse

parts = ("https", "vietnix.vn", "/search", "", "category=server&price=1000", "")
url = urlunparse(parts)

print("URL:", url)

Kết quả:

URL: https://vietnix.vn/search?category=server&price=1000

Giải thích

  • scheme: "https"
  • netloc: "vietnix.vn"
  • path: "/search"
  • params: "" (Không có tham số params)
  • query: "category=server&price=1000"
  • fragment: "" (Không có phần định danh)

urlunsplit(parts)

Kết hợp các thành phần của một bộ dữ liệu như được trả về bởi urlsplit() thành một URL đầy đủ dưới dạng chuỗi. Đối số parts có thể là bất kỳ bộ dữ liệu năm phần tử nào.

Ví dụ sử dụng urlunsplit():

from urllib.parse import urlunsplit

parts = ("https", "vietnix.vn", "/search", "category=server&price=1000", "")
url = urlunsplit(parts)

print("URL:", url)

Kết quả:

URL: https://vietnix.vn/search?category=server&price=1000

urlsplit(urlstring)

Tương tự như urlparse(), nhưng không tách các tham số khỏi URL. Điều này nên được sử dụng thay cho urlparse() nếu muốn áp dụng cú pháp URL mới cho phép áp dụng các tham số được áp dụng cho từng đoạn đường dẫn của URL.

Ví dụ:

from urllib.parse import urlsplit

url = "https://example.com/employees/name;param1=value1?salary=25000#section"
parsed_url = urlsplit(url)

print("Scheme:", parsed_url.scheme)
print("Netloc:", parsed_url.netloc)
print("Path:", parsed_url.path)
print("Query:", parsed_url.query)
print("Fragment:", parsed_url.fragment)

Kết quả:

Scheme: https
Netloc: example.com
Path: /employees/name;param1=value1
Query: salary=25000
Fragment: section

Xử lý URL bằng urllib.request

Module urllib.request trong Python cung cấp các phương thức để gửi yêu cầu HTTP và lấy dữ liệu từ URL. Hỗ trợ tải nội dung từ web, xử lý phản hồi HTTP và gửi yêu cầu có kèm headers tùy chỉnh.

Đọc nội dung từ URL với urlopen()

Hàm urlopen() mở URL được cung cấp, có thể là một chuỗi hoặc một đối tượng Request. Tham số tùy chọn timeout xác định thời gian chờ đợi tính bằng giây cho các hoạt động chặn. Hàm này hoạt động với các kết nối HTTP, HTTPS và FTP.

Hàm luôn trả về một đối tượng có thể hoạt động như một trình quản lý ngữ cảnh và có các thuộc tính url, headers, và status. Đối với các URL HTTP và HTTPS, kết quả trả về là một đối tượng http.client.HTTPResponse.

Ví dụ:

Mã dưới đây sử dụng hàm urlopen() để đọc dữ liệu nhị phân từ một file hình ảnh và ghi nó vào file . Bạn có thể mở file hình ảnh trên máy tính của mình bằng bất kỳ trình xem hình ảnh nào.

from urllib.request import urlopen

obj = urlopen("https://vietnix.vn/wp-content/uploads/2024/08/img.png")
data = obj.read()

with open("img.jpg", "wb") as img:
    img.write(data)

Kết quả:

img
Hướng dẫn sử dụng, sửa lỗi và xử lý URL trong Python chi tiết 6

Gửi request với Request()

Module urllib.request bao gồm lớp Request, một trừu tượng hóa của một yêu cầu URL. Hàm tạo nhận một chuỗi đối số bắt buộc là một URL hợp lệ.

Cú pháp:

urllib.request.Request(url, data, headers, origin_req_host, method=None)

Đối số:

  • url: Một chuỗi đại diện cho URL hợp lệ.
  • data: Một đối tượng chỉ định dữ liệu bổ sung để gửi tới máy chủ. Tham số này chỉ có thể được sử dụng với các yêu cầu HTTP. Dữ liệu có thể là bytes, đối tượng giống file, và các đối tượng lặp lại của các đối tượng giống kiểu bytes.
  • headers: Nên là một từ điển chứa các header và các giá trị tương ứng của chúng.
  • origin_req_host: Nên là máy chủ yêu cầu của giao dịch gốc.
  • method: Nên là một chuỗi chỉ ra phương thức HTTP của yêu cầu. Có thể là GET, POST, PUT, DELETE và các động từ HTTP khác. Mặc định là GET.

Ví dụ:

from urllib.request import Request
obj = Request("https://vietnix.vn/")

Đối tượng Request này bây giờ có thể được sử dụng làm đối số cho phương thức urlopen().

from urllib.request import Request, urlopen
obj = Request("https://vietnix.vn/")
resp = urlopen(obj)

Hàm urlopen() trả về một đối tượng HttpResponse. Gọi phương thức read() của nó sẽ lấy tài nguyên tại URL đã cho.

from urllib.request import Request, urlopen

obj = Request("https://vietnix.vn/")
resp = urlopen(obj)
data = resp.read()
print (data)

Gửi dữ liệu qua POST request

Nếu data được truyền vào Request, một yêu cầu POST sẽ được gửi đến máy chủ. Dữ liệu phải được mã hóa thành bytes.

from urllib.request import Request, urlopen
from urllib.parse import urlencode

values = {
    "name": "Bo",
    "location": "Vietnam",
    "language": "Vietnamese"
}
data = urlencode(values).encode("utf-8")
obj = Request("https://vietnix.vn", data=data)
resp = urlopen(obj)

Thêm headers vào request

Hàm tạo của Request cũng chấp nhận đối số headers để đẩy thông tin header vào yêu cầu. Đối số này nên là một đối tượng dictionary.

headers = {"User-Agent": "Mozilla/5.0"}
obj = Request("https://vietnix.vn", data=data, headers=headers)

Sửa lỗi thường gặp khi làm việc với URL trong Python

Làm việc với URL trong Python có thể gặp một số lỗi phổ biến, đặc biệt khi sử dụng các module như urllib.parseurllib.request. Dưới đây là các lỗi thường gặp và cách khắc phục.

URLError – Không thể kết nối đến server

URLError được tạo ra khi không có kết nối mạng (không có lộ trình đến máy chủ được chỉ định), hoặc máy chủ được chỉ định không tồn tại. Trong trường hợp này, ngoại lệ sẽ có thuộc tính ‘reason’.

Ví dụ

from urllib.request import Request, urlopen
import urllib.error as err

url = "https://vietnix.vn/khong-ton-tai"

try:
    response = urlopen(Request(url))
except err.URLError as e:
    print("Không thể kết nối đến Vietnix:", e.reason)

Kết quả:

Không thể kết nối đến Vietnix: [Errno 11001] getaddrinfo failed

Cách khắc phục:

  • Kiểm tra kết nối mạng trước khi gửi request.
  • Đảm bảo URL hợp lệ.
  • Bọc request trong try-except để tránh chương trình bị gián đoạn.

HTTPError – Lỗi HTTP phổ biến như 404, 403

Mỗi khi máy chủ gửi một phản hồi HTTP, nó kèm theo một mã trạng thái số. Mã này chỉ ra lý do máy chủ không thể đáp ứng yêu cầu. Mã này cho biết lý do tại sao máy chủ không thể thực hiện yêu cầu. Các trình xử lý mặc định sẽ xử lý một số phản hồi này cho bạn. Đối với những phản hồi mà nó không thể xử lý, hàm urlopen() sẽ đưa ra HTTPError. Ví dụ về HTTPError là ‘404 – Not found‘ (trang không tìm thấy), ‘403‘ (yêu cầu bị cấm), và ‘401‘ (yêu cầu xác thực).

Ví dụ:

from urllib.request import Request, urlopen
import urllib.error as err

url = "https://vietnix.vn/server-bi-khoa"

try:
    response = urlopen(Request(url))
except err.HTTPError as e:
    print(f"Lỗi HTTP {e.code}: {e.reason}")

Kết quả:

Lỗi HTTP 404: Not Found

Cách khắc phục:

  • Kiểm tra URL có chính xác không.
  • Nếu gặp lỗi 403, thử thêm User-Agent vào header để tránh bị chặn request tự động.

Vietnix – Giải pháp lưu trữ tốc độ cao, bảo mật vững chắc

Vietnix là đơn vị hàng đầu trong lĩnh vực cho thuê máy chủ (server), hosting, VPS, domain tại Việt Nam. Với cam kết cung cấp dịch vụ ổn định, bảo mật cao cùng đội ngũ hỗ trợ 24/7, Vietnix đã được hơn 80.000 khách hàng tin tưởng lựa chọn. Dịch vụ của Vietnix giúp doanh nghiệp tối ưu hiệu suất, bảo vệ dữ liệu và vận hành hiệu quả.

Thông tin liên hệ:

  • Website: https://vietnix.vn/
  • Hotline: 18001093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, TP. Hồ Chí Minh.

Câu hỏi thường gặp

Làm thế nào để phân tích một URL thành các phần nhỏ bằng Python?

Bạn có thể sử dụng urllib.parse.urlparse() để phân tích một URL thành các thành phần như scheme, netloc, path, params, query, và fragment. Ví dụ:

from urllib.parse import urlparse url = "https://example.com/path?name=value#section" parsed_url = urlparse(url) print(parsed_url.scheme) # https print(parsed_url.netloc) # example.com print(parsed_url.path) # /path print(parsed_url.query) # name=value print(parsed_url.fragment) # section

Cách lấy query string từ URL và chuyển thành dictionary?

Dùng urllib.parse.parse_qs() để tách query string thành một dictionary:

from urllib.parse import urlparse, parse_qs url = "https://example.com/path?name=John&age=30" query_params = parse_qs(urlparse(url).query) print(query_params) # {'name': ['John'], 'age': ['30']}

Làm sao để gửi request HTTP bằng urllib.request?

Sử dụng urllib.request.urlopen() để gửi request đến một URL và lấy nội dung phản hồi:

from urllib.request import urlopen url = "https://www.example.com" response = urlopen(url) content = response.read().decode() print(content)

Làm thế nào để xử lý lỗi HTTPError và URLError khi mở URL?

Dùng try-except để bắt lỗi:

from urllib.request import urlopen from urllib.error import URLError, HTTPError url = "https://www.nonexistentwebsite.com" try: response = urlopen(url) except HTTPError as e: print(f"Lỗi HTTP: {e.code} - {e.reason}") except URLError as e: print(f"Lỗi URL: {e.reason}")

Có nên sử dụng urllib để scrape dữ liệu từ web không?

urllib có thể dùng để lấy HTML từ trang web nhưng không hỗ trợ parsing mạnh mẽ như BeautifulSoup hoặc Scrapy.

urllib có hỗ trợ xử lý URL động không?

urllib.parse hỗ trợ xây dựng URL động từ các tham số, nhưng không hỗ trợ xử lý AJAX hay các trang web động như Selenium.

Lời kết

Việc thao tác với URL trong Python trở nên đơn giản hơn rất nhiều nhờ các module tích hợp sẵn như urllib.parseurllib.request. Hiểu rõ cách sử dụng những công cụ này không chỉ giúp bạn xử lý URL hiệu quả mà còn tối ưu hóa các tác vụ liên quan đến mạng và web scraping. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới mình hỗ trợ nhanh nhất. Cảm ơn bạn đã đọc!

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn