如何使用Requests和BeautifulSoup4构建火车票查询工具及实际使用案例
][]<p><pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);line-height: 1.5;overflow-x: auto;border-radius: 8px;"> <span hidden="" style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: Menlo, "Operator Mono", Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;white-space-collapse: collapse;"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">import</span> requests<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>url = <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);"></span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>response = requests.get(url)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 166, 87);">print</span>(response.text)</code></pre></p>
[]
解析HTML内容
使用解析 HTML 内容是很直观的。有一个示例能展示怎样去解析 HTML 并且提取特定的信息。
<p><pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);line-height: 1.5;overflow-x: auto;border-radius: 8px;"> <span hidden="" style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: Menlo, "Operator Mono", Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;white-space-collapse: collapse;"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">from</span> bs4 <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">import</span> BeautifulSoup<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>html_doc = <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">"""<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><html><head><title>The Dormouse's story</title></head><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><body><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><p class="title"><b>The Dormouse's story</p><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><p class="story"> <br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>Elsie,<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>Lacie and<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>Tillie;<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>他们居住在一口井的底部。</p><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/></body><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/></html><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>"""</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>soup 等于 BeautifulSoup 函数,其参数为 html_doc 和<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'html.parser'</span>)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 166, 87);">print</span>(soup.prettify())</code></pre></p>
这段代码会输出经过格式化的 HTML 内容,并且能够进一步去提取特定的标签或者属性。
https://img2.baidu.com/it/u=4126733141,2378661870&fm=253&fmt=JPEG&app=138&f=JPEG?w=500&h=1070
高级用法构建火车票查询工具
我们结合“和”,能够构建出一个简单的火车票查询工具。以下这些示例,可展示怎样去查询特定日期以及特定路线的火车票信息:
<p><pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);line-height: 1.5;overflow-x: auto;border-radius: 8px;"> <span hidden="" style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: Menlo, "Operator Mono", Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;white-space-collapse: collapse;"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">import</span> requests<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">from</span> bs4 <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">import</span> BeautifulSoup<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">def</span> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(210, 168, 255);">query_train_tickets</span>(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));">日期、出发站、到达站</span>):<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(139, 148, 158);"># 构建查询URL</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> url = <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">f'https://kyfw.12306.cn/otn/leftTicket/query 这个链接用于查询,查询的条件是 leftTicketDTO.train_date ,也就是列车日期。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{date}</span>&leftTicketDTO.from_station=<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{from_station}</span>&leftTicketDTO.to_station=<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{to_station}</span>&purpose_codes=ADULT'</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(139, 148, 158);"># 发送HTTP请求</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>使用 requests 库发送 GET 请求并将响应存储在 response 变量中。<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(139, 148, 158);"># 解析JSON响应</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> data = response.json()<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(139, 148, 158);"># 提取火车票信息</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> tickets = data[<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'data'</span>][<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'result'</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">for</span> ticket <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">in</span> tickets:<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>ticket_info 由 ticket 进行 split 操作得到。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'|'</span>)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>train_no 等于 ticket_info 中的某个元素。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">3</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>起始站等于票务信息中的[起始站的相关内容]。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">4</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>end_station 是 ticket_info 中的一个元素。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">5</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>start_time 等于 ticket_info 中的某个值。具体来说,start_time 是从 ticket_info 这个数据结构中获取到的一个特定的时间相关的信息。它可能是与票务相关的某个活动或事件的开始时间。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">8</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>end_time 等于 ticket_info 中的某个元素。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">9</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>duration 等于 ticket_info 中的某个内容。具体来说,duration 是 ticket_info 所包含的一个特定属性或元素的值。它代表着与该 ticket_info 相关的某个时间段或持续时间的信息。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">10</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>first_class_seat 等于 ticket_info 中的某个元素。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">31</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>second_class_seat 等于 ticket_info 中的某个元素。具体而言,它是 ticket_info 中特定位置或特定条件下所对应的那个值。<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">30</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 166, 87);">print</span>(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">f'车次:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{train_no}</span>,出发站:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{start_station}</span>,到达站:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{end_station}</span>,出发时间:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{start_time}</span>,到达时间:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{end_time}</span>,历时:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{duration}</span>,一等座:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{first_class_seat}</span>,二等座:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{second_class_seat}</span>'</span>)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(139, 148, 158);"># 示例查询</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>query_train_tickets(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'2024-10-01'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'SHH'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'BJP'</span>)</code></pre></p>
这段代码能够输出 2024 年 10 月 1 日的火车票信息,且是从上海到北京的。
实际使用案例案例1:查询节假日火车票
节假日时,火车票的需求会大幅增加。以下是关于如何查询特定节假日火车票信息的一个示例:
<p><pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);line-height: 1.5;overflow-x: auto;border-radius: 8px;"> <span hidden="" style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: Menlo, "Operator Mono", Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;white-space-collapse: collapse;">query_train_tickets(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'2024-10-01'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'SHH'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'BJP'</span>)</code></pre></p>
这段代码能够输出 2024 年 10 月 1 日的火车票信息,这些信息是关于从上海到北京的,它可以帮助用户提前对行程进行规划。
https://img2.baidu.com/it/u=2235482959,3779623606&fm=253&fmt=JPEG&app=120&f=JPEG?w=1178&h=664
案例2:查询多条路线的火车票
用户有时可能有查询多条路线火车票信息的需求。以下是一个能展示如何查询多条路线火车票信息的示例:
<p><pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);line-height: 1.5;overflow-x: auto;border-radius: 8px;"> <span hidden="" style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: Menlo, "Operator Mono", Consolas, Monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;white-space-collapse: collapse;"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">def</span> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(210, 168, 255);">query_multiple_routes</span>(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));">dates, routes</span>):<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">for</span> date <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">in</span> dates:<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">for</span> route <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 123, 114);">in</span> routes:<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>route 得出了 from_station 和 to_station<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 166, 87);">print</span>(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">f'查询日期:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{date}</span>,路线:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{from_station}</span> -> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(201, 209, 217);">{to_station}</span>'</span>)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>查询火车票(日期、出发站、到达站)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/> <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(255, 166, 87);">print</span>(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'-'</span> * <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(121, 192, 255);">50</span>)<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(139, 148, 158);"># 示例查询</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>dates = [<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'2024-10-01'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'2024-10-02'</span>]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>routes = [(<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'SHH'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'BJP'</span>), (<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'SHH'</span>, <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(165, 214, 255);">'GZQ'</span>)]<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"/>对日期和路线进行查询多条路线的操作,即 query_multiple_routes 这个动作涉及到日期和路线这两个方面。</code></pre></p>
这段代码会输出 2024 年 10 月 1 日的火车票信息,包括从上海到北京以及从上海到广州的情况。同时,也会输出 2024 年 10 月 2 日的火车票信息,同样包含从上海到北京和从上海到广州的情况。通过这样的输出,能帮助用户全面了解不同路线的票务情况。
琳琳姐总结
通过本文的介绍,我们了解到可以从基础开始,逐步迈向高级,从而学会如何使用来实现一个简单的火车票查询工具。希望本文能为你在开发中的探索给予帮助,使你能够更自信地实现自己的项目。
页:
[1]