我正在尝试使用Python请求模块来填充Web表单并使用BeautifulSoup来解析生成的网页以获取其中的链接(实际上是与FITS格式的图像的图像链接),然后保存它。
这是我提交表单的网站:http://tgss.ncra.tifr.res.in/tgss_postage_test.html
我的代码如下:
import requests as r
from bs4 import BeautifulSoup as bs
import shutil
url = "http://tgss.ncra.tifr.res.in/cgi-bin/tgss_postage_test.cgi"
val = { 'raval':'12 00 00.00', 'decval':'-32 00 00.00'}
s1 = r.post(url, data=val)
soup = bs(s1.text,'lxml')
for link in soup.find_all('a'):
if 'tgss.ncra' in link['href']:
imgurl = link['href']
print imgurl
res = r.get(imgurl, stream=True)
with open('img.fits', 'wb') as out_file:
shutil.copyfileobj(res.raw, out_file)
对于试用表格值,例如'raval':'12 00 00.00','decval':' - 32 00 00.00'会产生一个包含链接的网页。我无法共享指向结果网页的链接,因为它是一般链接,只有在填写表格后才能查看内容,如上一个链接所示。
从代码中可以看出,我使用BeautifulSoup来解析生成的网页并获得图像链接。 问题是我从我的小代码中获得的链接不正确。当我把它写出来时,我得到一个只有14 kb的图像文件(img.fits)。 如果我手动做同样的事情,我得到一个正确的链接,然后保存的图像是124 kb
我是编程新手,不了解HTML,所以知道出了什么问题会有所帮助吗?它是有问题的网站还是我的代码。
答案 0 :(得分:0)
您省略了original form发送的几个参数;这些仍然需要:
val = {
'raval': '12 00 00.00',
'decval': '-32 00 00.00',
'szval': '0.25',
'szunit': 'deg',
'fmtval': 'fits'
}
使用这些附加参数,生成的文件长度为216000字节:
>>> val = { 'raval':'12 00 00.00', 'decval':'-32 00 00.00', 'szval': '0.25', 'szunit': 'deg', 'fmtval': 'fits'}
>>> s1 = r.post(url, data=val)
>>> soup = bs(s1.text,'lxml')
>>> imgurl = soup.select('a[href*=tgss.ncra]')[0]['href']
>>> res = r.get(imgurl, stream=True)
>>> res.headers['content-length']
'216000'
使用CSS selector选择特定网址,可以改善您的BeautifulSoup解析:
soup = bs(s1.content, 'lxml') # leave decoding to BS4
fits_links = soup.select('a[href*=tgss.ncra]')
if fits_links:
imgurl = fits_links[0]['href']
res = r.get(imgurl, stream=True)
with open('img.fits', 'wb') as out_file:
r.raw.decode_content = True # in case compression was used
shutil.copyfileobj(res.raw, out_file)
我还在那里的原始urllib3
连接对象上启用了Content-Encoding压缩处理;如果服务能够实现这样的压缩,那么它将透明地处理解压缩。