Python 从文本文件复制数据并将其插入URL

Python 从文本文件复制数据并将其插入URL,python,python-3.x,urllib,Python,Python 3.x,Urllib,背景: 我正在构建一个程序,从互联网上获取天气数据,并将其作为GUI的一部分显示给用户。用户将输入他们的位置详细信息,特别是他们的邮政编码或邮政编码、城市或城镇、纬度和经度。该程序将这四条信息存储到一个文本文件中,这样用户每次需要请求天气数据时都可以读取详细信息,而不必在每次请求时输入这些详细信息。这个问题涉及的模块是urllib和beautifulsou import urllib.request from bs4 import BeautifulSoup 问题: 我已成功地将用户详细信息存

背景:

我正在构建一个程序,从互联网上获取天气数据,并将其作为GUI的一部分显示给用户。用户将输入他们的位置详细信息,特别是他们的邮政编码或邮政编码、城市或城镇、纬度和经度。该程序将这四条信息存储到一个文本文件中,这样用户每次需要请求天气数据时都可以读取详细信息,而不必在每次请求时输入这些详细信息。这个问题涉及的模块是urllib和beautifulsou

import urllib.request
from bs4 import BeautifulSoup
问题:

我已成功地将用户详细信息存储到文本文件中,并从中读取。插入数据的代码如下所示:

userPostcode = postcodeEntry.get()
userCity     = cityEntry.get()
userLat      = latitudeEntry.get()
userLong     = longitudeEntry.get()
file = open("LocationInfo.txt", 'w')
file.write(str(userPostcode) + "\n")
file.write(str(userCity) + "\n")
file.write(str(userLat) + "\n")
file.write(str(userLong)+ "\n")
file.close()
SK15 IJF
SOME TOWN
54.25
-122.312
f=open('LocationInfo.txt')
line=f.readlines()
Post = line[0]
Town = line[1]
Lat  = line[2]
Long = line[3]
f.close()
文本文件中的数据结构如下所示:

userPostcode = postcodeEntry.get()
userCity     = cityEntry.get()
userLat      = latitudeEntry.get()
userLong     = longitudeEntry.get()
file = open("LocationInfo.txt", 'w')
file.write(str(userPostcode) + "\n")
file.write(str(userCity) + "\n")
file.write(str(userLat) + "\n")
file.write(str(userLong)+ "\n")
file.close()
SK15 IJF
SOME TOWN
54.25
-122.312
f=open('LocationInfo.txt')
line=f.readlines()
Post = line[0]
Town = line[1]
Lat  = line[2]
Long = line[3]
f.close()
从文本文件读取的代码如下所示:

userPostcode = postcodeEntry.get()
userCity     = cityEntry.get()
userLat      = latitudeEntry.get()
userLong     = longitudeEntry.get()
file = open("LocationInfo.txt", 'w')
file.write(str(userPostcode) + "\n")
file.write(str(userCity) + "\n")
file.write(str(userLat) + "\n")
file.write(str(userLong)+ "\n")
file.close()
SK15 IJF
SOME TOWN
54.25
-122.312
f=open('LocationInfo.txt')
line=f.readlines()
Post = line[0]
Town = line[1]
Lat  = line[2]
Long = line[3]
f.close()
我将这些变量的值插入URL的方式是使用以下方法:

page_url = "https://www.metcheck.com/WEATHER/now_and_next.asp? 
zipcode=%s+%s&lat=%s&lon=%s" % (Post, Town, Lat, Long)
soup = BeautifulSoup(urllib.request.urlopen(page_url), "lxml")
*注意,url在实际程序中都位于一行上

错误:

我收到的错误是:

Exception in Tkinter callback
Traceback (most recent call last):
Python\Python36-32\lib\http\client.py", line 279, in _read_status
raise BadStatusLine(line)
http.client.BadStatusLine: <html>
Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): Python\Python36-32\lib\http\client.py”,第279行,处于读取状态 升起状态行(行) http.client.BadStatusLine:
只有当我尝试使用分配给文本文件中数据的变量名,并尝试使用%方法将其插入URL时,才会出现此错误。当我直接将值输入URL字符串而不是使用变量名时,会出现预期结果。因此,我有理由相信问题与变量本身和值不是有效的实际数据。

您可以
请求

import requests

page_url = "https://www.metcheck.com/WEATHER/now_and_next.asp? 
zipcode=%s+%s&lat=%s&lon=%s" % (Post, Town, Lat, Long)

r = requests.get(page_url)

找到了一种方法:

使用.format将值插入URL字符串,然后将其作为urllib.request.urlopen(*args)的参数传递

我相信发生错误的原因是因为这些值被写入文本文件,并且在每个条目的末尾使用了“换行符”。这意味着当URL试图格式化文本文件中的数据时,它也会读取换行符条目,这意味着URL无效。我通过简单地更改代码来解决这个问题,以便数据写在文本文件的一行上,并用逗号分隔。然后使用.split函数将数据的每个部分分隔开来,形成一个列表,然后简单地将列表中的每个元素传递到URL中。这很有技巧,但它可以完成这项工作

file = open("LocationInfo.txt", 'w')
file.write(str(userPostcode + ","))
file.write(str(userCity + ","))
file.write(str(userLat + ","))
file.write(str(userLong+ ","))
file.close() 

为了解决你的新行问题,考虑将信息存储为JSON文件。这将使解析变得更容易,这就是它设计的目的。它还允许你在将来想添加程序时添加特性。

这与你的问题关系不大,OP.但不建议从网页上抓取HTML数据。我不知道你如何解析数据,但如果网站的设计发生变化,可能会损害你的解析器

一个更好的方法是寻找一个API。metcheck有哪个。 更多信息。更准确地说,(查看JSON URL下)

您的站点示例:

import requests
import json
json_data = requests.get("http://ws1.metcheck.com/ENGINE/v9_0/json.asp?lat=51.8&lon=-0.1&lid=60357&Fc=No").text
first_day = json.loads(json_data)["metcheckData"]["forecastLocation"]["forecast"][0]
print(first_day["weekday"]) # print the first day of the first forecast.
print(first_day["temperature"]) # print the temperature of the first day.
可能重复的