Hướng dẫn python build query string - chuỗi truy vấn xây dựng python

Chuỗi truy vấn URL là gì?

Một URL điển hình trông rất giống một đường dẫn tệp hệ thống, ví dụ:

 http://www.example.com/index.html

Một chuỗi truy vấn là một quy ước để nối các cặp giá trị khóa vào URL. URL tiêu chuẩn cho trang web New York của New York Times là:query string is a convention for appending key-value pairs to a URL. The standard URL for the New York Times's website's New York section is this:

  http://www.nytimes.com/section/nyregion

Tuy nhiên, nếu bạn nhấp vào tab New York qua trang chủ của NYTimes.com, bạn sẽ nhận thấy rằng cả một loạt các ký tự được thêm vào URL:

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage

Dấu câu hỏi

  https://www.duckduckgo.com/?q=Stanford
4 biểu thị sự phân tách giữa URL tiêu chuẩn và chuỗi truy vấn. Tất cả mọi thứ sau đó là một cặp giá trị chính, với mỗi cặp được phân tách bằng một ampersand,
  https://www.duckduckgo.com/?q=Stanford
5. Dấu hiệu bằng
  https://www.duckduckgo.com/?q=Stanford
6 được sử dụng để tách khóa và giá trị.question mark
  https://www.duckduckgo.com/?q=Stanford
4 denotes the separation between the standard URL and the query string. Everything after that is a key value pair, with each pair separated by an ampersand,
  https://www.duckduckgo.com/?q=Stanford
5. The equals sign
  https://www.duckduckgo.com/?q=Stanford
6 is used to separate key and value.

Vì vậy, các cặp giá trị khóa trong chuỗi truy vấn trên là:

Chìa khóagiá trị
hoạt độngnhấp chuột
pgtypeTrang chủ

Hoặc, nhiều hơn cho mục đích của chúng tôi, đây là những gì các bàn phím đó sẽ trông như một từ điển:dictionary:

{
  'action': 'click',
  'pgtype': 'Homepage'
}

Những người thực sự làm gì? Đó thực sự là một câu hỏi mà chúng tôi không thể trả lời, trừ khi chúng tôi đang chạy các máy chủ NYTimes.com. Mặc dù có thể an toàn khi cho rằng NYT sử dụng chuỗi truy vấn trong các phân tích của nó, để có thể biết có bao nhiêu người đã truy cập

  https://www.duckduckgo.com/?q=Stanford
7 thông qua trang chủ và bằng cách nhấp vào một số nút.

Các dịch vụ web khác có các chuỗi truy vấn phục vụ một mục đích rõ ràng hơn. Ví dụ, Duckduckgo, có điểm cuối URL này:DuckDuckGo, which has this URL endpoint:

  https://www.duckduckgo.com/

Tuy nhiên, nếu chúng ta nối một giá trị cặp khóa là chuỗi truy vấn, với

  https://www.duckduckgo.com/?q=Stanford
8 là chìa khóa (hãy nghĩ về nó như là một chữ viết tắt cho "truy vấn") và giá trị là thuật ngữ chúng ta muốn tìm kiếm, ví dụ:
  https://www.duckduckgo.com/?q=Stanford
9, sau đó Duckduckgo sẽ trả về kết quả tìm kiếm cho
  https://www.duckduckgo.com/?q=Stanford
9:key (think of it as an abbreviation for "query") and the value being the term we want to search for, e.g.
  https://www.duckduckgo.com/?q=Stanford
9, then DuckDuckGo will return search results for
  https://www.duckduckgo.com/?q=Stanford
9:

  https://www.duckduckgo.com/?q=Stanford

Ký tự không hợp lệ cho URL

Thật khó để nói những ngày này vì các trình duyệt web hiện đại cho phép chúng tôi gõ bất cứ thứ gì từ bàn phím. Trừ khi chúng tôi dành đầu vào với

  Stanford University 
1, văn bản chỉ được gửi như là Google hoặc Duckduckgo hoặc bất kỳ công cụ tìm kiếm mặc định nào của bạn.

Tuy nhiên, đây chỉ là một ảo ảnh thuận tiện. Khi chúng tôi nhập vào thanh trình duyệt của bạn, nói, một cái gì đó có ký tự khoảng trắng, ví dụ:

  Stanford University 

Trước khi gửi nó đến công cụ tìm kiếm, trình duyệt web sẽ thực sự tuần tự hóa nó như:

  Stanford%20University

Điều này là do các ký tự khoảng trắng không được phép trong các URL, vì vậy mã thông báo

  Stanford University 
2 được sử dụng để đại diện cho nó. Về cơ bản, hầu hết mọi thứ không phải là một nhân vật chữ và số cần phải có mã hóa đặc biệt này.not allowed in URLs, so the token
  Stanford University 
2 is used to represent it. Basically, almost everything that is not an alphanumeric character needs to have this special encoding.

Vào thời xa xưa, bạn phải nhớ cách thực hiện các mã hóa này nếu không thì trình duyệt sẽ khiến bạn gặp lỗi. Bây giờ, trình duyệt chỉ sửa nó cho bạn, không giống như trình kiểm tra chính tả tự động.

Cách Urllib của Python xử lý các ký tự URL không hợp lệ

Tất nhiên, khi lập trình trong Python, mọi thứ vẫn hoạt động như thời xa xưa - tức là chúng ta buộc phải là _Explicit.

Đây là những gì xảy ra khi bạn sử dụng phương pháp

  Stanford University 
3 đi qua mô-đun tích hợp của Python
  Stanford University 
4:

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")

Một lỗi được nêu ra:

HTTPError: HTTP Error 400: Bad Request

Chúng ta phải tự mình ném vào

  Stanford University 
2 để tránh lỗi:

  http://www.nytimes.com/section/nyregion
0

Sử dụng urllib.parse.quote để thoát khỏi các ký tự không hợp lệ

Cố gắng nhớ những nhân vật nào không hợp lệ, không bao giờ thoát khỏi chúng bằng tay với các dấu hiệu phần trăm, là một nhiệm vụ điên rồ. Đó là lý do tại sao có một mô-đun Python tích hợp-Urllib.parse-có chứa một phương pháp thích hợp:

  Stanford University 
6.

Hãy thử nó thông qua Python tương tác - Lưu ý rằng

  Stanford University 
7 không thực sự tự thực hiện bất kỳ URL nào - đó là một phương pháp làm một điều và một điều tốt: làm cho chuỗi an toàn cho URL:

  http://www.nytimes.com/section/nyregion
1

Kết hợp với phương pháp URLRETREE đã được thử trước đó:

  http://www.nytimes.com/section/nyregion
2

Tuần tự hóa từ điển thành chuỗi truy vấn

Trong ví dụ trước, phải gõ rằng

  Stanford University 
8 cũng có vẻ tẻ nhạt đối với bạn. Một lần nữa, urllib.parse có một phương thức cho điều đó: urlencode.urlencode.

Hãy thử nó trong Python tương tác:

  http://www.nytimes.com/section/nyregion
3

Lưu ý rằng phương pháp

  Stanford University 
9 bao gồm chức năng của hàm
  Stanford University 
6, do đó, có lẽ bạn hiếm khi cần phải tự gọi
  Stanford University 
6. Cũng lưu ý rằng
  Stanford University 
9 sử dụng dấu
  Stanford%20University
3 để mã hóa ký tự không gian trong URL, về cơ bản cũng hợp lệ như sử dụng
  Stanford University 
2. Một lần nữa, các quy tắc và tiêu chuẩn khó hiểu là một lý do khác để ủy thác phân tích chuỗi này cho các thư viện Python thích hợp.

Và, một lần nữa,

  Stanford University 
9 không thực sự tìm nạp URL. Chúng tôi vẫn phải sử dụng
  Stanford University 
3:

  http://www.nytimes.com/section/nyregion
4

Lưu ý rằng chúng tôi cũng phải bao gồm

  https://www.duckduckgo.com/?q=Stanford
4, luôn được sử dụng để đặt chuỗi truy vấn từ phần đầu tiên của URL.

Cũng lưu ý rằng việc tìm kiếm các truy vấn tìm kiếm theo chương trình qua Duckduckgo (hoặc Google, vì vấn đề đó) không hiệu quả lắm. Tôi chỉ sử dụng nó làm ví dụ để bạn có thể thấy URL hóa ra là gì và kiểm tra nó trong trình duyệt của bạn.

Yêu cầu giải cứu

Thế còn thư viện yêu cầu mà chúng tôi đã sử dụng để tìm nạp URL cho hầu hết các phần? Vâng, đúng với khẩu hiệu của nó là "HTTP cho con người", thư viện yêu cầu kết thúc một cách gọn gàng tất cả các chức năng

  Stanford%20University
8 cho chúng tôi.

Chỉ cần sử dụng phương thức

  Stanford%20University
9 với đối số thứ hai (tên của đối số là
from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
0):

  http://www.nytimes.com/section/nyregion
5

Thử bản đồ tĩnh Google

Hãy làm việc với API trực quan, thú vị hơn: API bản đồ tĩnh Google

(Để biết thêm thông tin về API Google Static Map

Đánh giá các tham số bản đồ tĩnh

Như với hầu hết các API, Google Static Maps bắt đầu với điểm cuối URL:

  http://www.nytimes.com/section/nyregion
6

Ở mức tối thiểu, nó yêu cầu tham số kích thước, với giá trị ở định dạng

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
1:size parameter, with a value in the format of
from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
1:

  http://www.nytimes.com/section/nyregion
7

Đây là những gì bản đồ trông giống như:

Hướng dẫn python build query string - chuỗi truy vấn xây dựng python

Hãy thêm một tham số khác: Zoomzoom

  http://www.nytimes.com/section/nyregion
8

Và hãy thay đổi nơi bản đồ được tập trung xung quanh với tham số trung tâm, lấy bất kỳ chuỗi nào mô tả vị trí có thể đọc được của con người:center parameter, which takes any string that describes a human-readable location:

  http://www.nytimes.com/section/nyregion
9

Hoặc, chúng ta có thể vượt qua trong một cặp vĩ độ/kinh độ:

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
0

Thêm điểm đánh dấu

Có lẽ bạn đang nghĩ: Điều này thật dễ dàng, mã hóa các tham số URL. Hãy làm điều gì đó khó khăn. Tham số đánh dấu cho phép chúng tôi thêm các điểm đánh dấu vào bản đồ. Nó lấy một chuỗi vị trí (giống như trung tâm):markers parameter lets us add markers to the map. It takes a location string (just like center):

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
1

Tuy nhiên, API cho phép đánh dấu nhiều điểm (do đó, tên số nhiều tham số của "điểm đánh dấu"). Tiêu chuẩn cho các chuỗi truy vấn URL Khi nhiều giá trị có cùng một khóa là lặp lại khóa, nói cách khác, hiển thị

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
2 cho cả
from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
3 và
from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
4, chúng tôi bao gồm điều này trong chuỗi truy vấn:

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
2

e.g.

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
3

Tùy chỉnh phong cách của các điểm đánh dấu

Bởi vì cả thông tin phong cách và thông tin vị trí đều được phân định thông qua ký tự ống, thông tin kiểu phải xuất hiện đầu tiên trong bất kỳ mô tả đánh dấu nào. Khi máy chủ API của Google Static Maps sẽ gặp một vị trí trong bộ mô tả điểm đánh dấu, tất cả các tham số đánh dấu khác cũng được coi là vị trí.

Theo mặc định, các điểm đánh dấu bản đồ có màu đỏ. Để tạo màu xanh lá cây đánh dấu, đây là những gì giá trị

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
2 được đặt thành:red. To make a marker green, this is what the
from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
2 value is set to:

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
4

e.g.

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
5
!]Chicago] (https://maps.googleapis.com/maps/api/staticmap?size=600x400&markers=Color:GreenChicago)

Chúng ta cũng có thể thay đổi kích thước của biểu tượng. Và cho nó một lá thư. Đây là giá trị cho một biểu tượng màu xanh cho Chicago, với một nhãn bao gồm chữ "X":

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
6
!]Nhãn: xChicago] (https://maps.googleapis.com/maps/api/staticmap?size=600x400&markers=Color:BlueNhãn: xChicago)

Chúng ta cũng có thể thay đổi kích thước của biểu tượng. Và cho nó một lá thư. Đây là giá trị cho một biểu tượng màu xanh cho Chicago, với một nhãn bao gồm chữ "X":

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
7

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
6

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
8

!]

 http://www.nytimes.com/section/nyregion?action=click&pgtype=Homepage
9

Nhãn: x

Chicago] (https://maps.googleapis.com/maps/api/staticmap?size=600x400&markers=Color:Blue

Về mặt kỹ thuật, trong khi các ví dụ URL ở trên sẽ hoạt động trong một trình duyệt hiện đại, các ký tự ống không được phép vào URL. Họ nên được trốn thoát với

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
6:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
0

Nếu điều đó không bị phức tạp/đủ xấu cho bạn, API Google Maps cho phép bạn sử dụng các biểu tượng tùy chỉnh. Đây là cách tạo điểm đánh dấu bằng khuôn mặt của Tổng thống Obama (được tìm thấy ở URL sau:

Hướng dẫn python build query string - chuỗi truy vấn xây dựng python

Giá trị from urllib.request import urlretrieve thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University") 2 tương ứng:

Tuy nhiên, như bạn có thể tưởng tượng, một số ký tự trong URL không được phép như trong chuỗi truy vấn. Nghĩ về nó; Chúng ta đang đặt một URL bên trong một URL khác, làm thế nào một trình duyệt nguyên thủy dễ dàng phân tích lại điều đó? Ví dụ URL ở trên khá đơn giản, nhưng vì các URL có thể chứa bất kỳ số lượng ký tự lạ nào, chúng ta nên cho rằng nhiều nhân vật đó sẽ phải được mã hóa theo phần trăm thời trang đó. Từ lời giải thích của Google API:

Đầu tiên, chúng ta hãy nhập

  Stanford University 
9 và thiết lập các hằng số, tức là các biến không thay đổi:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
1

Nhập

HTTPError: HTTP Error 400: Bad Request
1 là tùy chọn. Nhưng nó cho phép bạn kiểm tra thuận tiện các URL từ mã Python của bạn:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
2

(Bạn nên làm điều này trong Python tương tác)

Ở đây chúng tôi đi.

URL API bản đồ tĩnh cơ bản của Google

Chỉ cần chỉ định tham số

HTTPError: HTTP Error 400: Bad Request
2:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
3

Thêm zoom

Đây chỉ đơn giản là một cặp giá trị khóa khác trong từ điển:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
4

Thêm trung tâm

Một lần nữa, chỉ là một cặp giá trị khóa khác

{
  'action': 'click',
  'pgtype': 'Homepage'
}
5

Thêm điểm đánh dấu

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
2 chỉ là một cặp giá trị khóa khác, khi chúng tôi chỉ thêm một điểm đánh dấu:

.

{
  'action': 'click',
  'pgtype': 'Homepage'
}
6

Sử dụng tham số liều của UrlenCode để chỉ định danh sách các giá trị

OK, thêm nhiều điểm đánh dấu là nơi mọi thứ trở nên hơi phức tạp. Chúng tôi có thể đại diện cho một danh sách các chuỗi vị trí bằng cách sử dụng, một danh sách các chuỗi:list of strings:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
7

Tuy nhiên, chúng ta phải gọi

  Stanford University 
9 với đối số
HTTPError: HTTP Error 400: Bad Request
6 được đặt thành
HTTPError: HTTP Error 400: Bad Request
7 (thử bỏ qua đối số để xem kết quả của riêng bạn):

{
  'action': 'click',
  'pgtype': 'Homepage'
}
8

Chỉ để giải trí, tuần tự hóa một loạt các vị trí vào URL bản đồ tĩnh của Google:

{
  'action': 'click',
  'pgtype': 'Homepage'
}
9

Hình ảnh và URL kết quả:

Ánh xạ động đất

Đó không phải là nhiều niềm vui khi tạo ra danh sách bằng tay. Vì vậy, chúng ta hãy sử dụng một danh sách từ một nguồn chính thức của chính phủ: Chương trình nguy cơ động đất USGS.

Ví dụ dưới đây là một minh chứng của mô -đun

HTTPError: HTTP Error 400: Bad Request
8 và hàm
HTTPError: HTTP Error 400: Bad Request
9, có thể được sử dụng để tạo danh sách các từ điển từ tệp CSV.

  https://www.duckduckgo.com/
0

Đây là URL kết quả (tính đến ngày 9 tháng 2 năm 2016):

Dưới đây là phiên bản được làm sạch hơn một chút của mã sử dụng thư viện yêu cầu để "chuẩn bị" URL:

  https://www.duckduckgo.com/
1

Hãy tạo một chức năng để ánh xạ các điểm đánh dấu

Trước khi chúng ta tham gia vào công việc khó khăn trong việc tạo kiểu cho các điểm đánh dấu, hãy kết thúc chức năng mà chúng ta đã sử dụng để tạo URL bản đồ tĩnh Google Static thích hợp thành một chức năng:

(Giả sử bạn đã đọc hướng dẫn ngắn về các chức năng: Các nguyên tắc cơ bản trong Python)

Đây là triển khai xương trần, trong đó người dùng chỉ phải chỉ định danh sách (hoặc chỉ là một chuỗi, nếu chỉ có một vị trí) vị trí và, tùy chọn, chiều rộng và chiều cao. Hàm

  http://www.nytimes.com/section/nyregion
00 thực hiện công việc tuần tự hóa đầu vào thành định dạng API bản đồ tĩnh của Google.list (or just a string, if there's only one location) of locations and, optionally, width and height. The
  http://www.nytimes.com/section/nyregion
00 function does the work of serializing the input into proper Google Static Maps API format.

Cuối cùng, nó trả về URL dưới dạng đối tượng chuỗi:

  https://www.duckduckgo.com/
2

Đây là cách bạn sẽ sử dụng nó, tương tác:

  https://www.duckduckgo.com/
3

Kiểm tra các URL đó bằng cách dán chúng vào trình duyệt web rất tốn thời gian. Vì vậy, hãy tạo một chức năng khác. Cái này không trả lại bất cứ điều gì. Thay vào đó, nó có các tham số tương tự như

  http://www.nytimes.com/section/nyregion
01, nhưng chuyển chúng trực tiếp vào
  http://www.nytimes.com/section/nyregion
01, sau đó chuyển kết quả của điều đó vào
  http://www.nytimes.com/section/nyregion
03, thực hiện hành động mở Webbrowser:

(Lưu ý rằng định nghĩa này giả định rằng

  http://www.nytimes.com/section/nyregion
01 đã được xác định trước đó)

  https://www.duckduckgo.com/
4

Điểm đánh dấu kiểu dáng

.

Đây là nơi nó trở nên khó khăn. Một cách nhắc nhở,

from urllib.request import urlretrieve
thing = urlretrieve("https://www.duckduckgo.com/?q=Stanford University")
2 lấy một chuỗi phân loại đường ống để tách cấu hình kiểu, ví dụ:

  https://www.duckduckgo.com/
5

Tuy nhiên, đó là một quy ước về việc tạo ra của Google, bởi vì họ cần một cách để thực hiện các cặp giá trị khóa (ví dụ:

  http://www.nytimes.com/section/nyregion
06 =
  http://www.nytimes.com/section/nyregion
07) độc lập (hay đúng hơn là lồng nhau) theo cách mà các cặp có giá trị khóa được thực hiện trong chuỗi truy vấn URL .

Về cơ bản, chúng ta phải tự tạo ra chuỗi:

  https://www.duckduckgo.com/
6

Kết quả của mã trên sẽ dẫn đến biến

  http://www.nytimes.com/section/nyregion
08 trỏ đến một chuỗi như thế này:

  https://www.duckduckgo.com/
7

Mà sau đó chúng ta có thể chuyển vào đối số

  http://www.nytimes.com/section/nyregion
09 của hàm
  http://www.nytimes.com/section/nyregion
01 được xác định trước đó của chúng tôi:

  https://www.duckduckgo.com/
8

Tạo ra một URL như thế này:

  https://www.duckduckgo.com/
9

Xác định phong cách đánh dấu chắc chắn đã phức tạp, nó phức tạp đến mức nó có thể xứng đáng với phương pháp riêng của nó.

Tạo hàm created_styled_marker ()

Tôi sẽ bỏ qua lời giải thích đầy đủ, hoặc thậm chí bận tâm tạo ra những gì tôi coi là triển khai trong thế giới thực tốt nhất của hàm

  http://www.nytimes.com/section/nyregion
11. Chúng ta có thể bao gồm nó trong một bài học khác, nhưng điểm chính là: Hãy xem cách chúng ta có thể sử dụng các chức năng và cấu trúc dữ liệu Python, như danh sách và từ điển, để tạo chuỗi văn bản hữu ích để liên lạc với các dịch vụ khác.lists and dictionaries, to create text strings useful for communicating with other services.

Không cần xây dựng thêm, đây là cách biến mã ánh xạ biểu tượng trước đó thành một hàm có thể tái sử dụng:

  https://www.duckduckgo.com/?q=Stanford
0

Lưu ý: Nếu danh sách và từ điển là chiếc mũ cũ cho bạn và bạn hiểu danh sách toàn diện, cũng như định dạng chuỗi, đây là một chiếc quần pythony-phiên bản ưa thích:

  https://www.duckduckgo.com/?q=Stanford
1

Dưới đây là tất cả các mã có liên quan để tạo ra một trình bao bọc tiện lợi Quickie-Let-a-Google-static-maps-API, như một kịch bản lớn:

Lưu ý rằng tôi đã sửa đổi đáng kể

  http://www.nytimes.com/section/nyregion
01 từ cuộc biểu tình trước đó.Xem liệu bạn có thể gỡ rối lý do không, nhưng nó không đáng để giải thích đầy đủ vì đây không phải là một bài học về thiết kế ứng dụng

  https://www.duckduckgo.com/?q=Stanford
2

Và khi các chức năng được xác định và tải vào trình thông dịch, đây là cách chúng tôi gọi các chức năng:

  https://www.duckduckgo.com/?q=Stanford
3