【问题标题】:Error in the webpage obtained by using Python's requests's post method使用Python requests post方法获取的网页报错
【发布时间】:2015-09-19 15:10:01
【问题描述】:

我正在尝试使用 Python 请求模块进行网络表单填充并使用 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 一无所知,所以知道出了什么问题会很有帮助吗?是网站有问题还是我的代码。

【问题讨论】:

  • 脚本生成的链接确实是一个14kb的文件;这就是服务器为您提供的全部内容。真的,我认为您的代码没有任何问题。
  • 查看presumed form itself,也许您只需要包含其他正在发布的参数?您缺少 szval、szunit 和 fmtval 参数。
  • 如果我手动填写表格,然后将“FITS 文件”链接保存在生成​​的网页上,则该文件为 124 kb。我确实尝试过给出这些值,但它可能会导致回溯,因为它们已经在表单中设置了。
  • 不,我设置了参数,正如预期的那样,我得到了一个更大的文件。

标签: python html beautifulsoup python-requests


【解决方案1】:

您省略了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 选择特定 URL 来稍微改进一下 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 连接对象启用了内容编码压缩处理;如果服务启用了这样的压缩,它将透明地处理解压缩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2019-10-02
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多