python - 如何在 Python 中绕过 Mechanize "AmbiguityError"

标签 python forms mechanize

我正在尝试通过填写网络表单并请求 POST 将图像上传到 ImageBam。

我不太了解 urllib2、httplib、多部分的东西。我正在尝试使用 MECHANIZE 模块 但我认为它不应该太复杂,因为它只是一个网络表单,我会填写并发布。

页面,其中上传表单是: http://www.imagebam.com/basic-upload

我要填写的表格:

<form name='form' id='form' enctype="multipart/form-data" method="post" action="/sys/upload/save">


    <table align="center">
        <tr>
            <td>
                01: <input type="file" name="file[]" size="30"><br>
                02: <input type="file" name="file[]" size="30"><br>
                03: <input type="file" name="file[]" size="30"><br>
                04: <input type="file" name="file[]" size="30"><br>
                05: <input type="file" name="file[]" size="30"><br>

我还看到有人用 python 创建了一个应用程序; http://sourceforge.net/projects/pymguploader/files/pymguploader/2011-12-24/ 我想写类似的东西,但当然更基础。


无论如何,这是我的问题; 当我执行这些时;

import mechanize
a=mechanize.Browser()
a.open("http://www.imagebam.com/basic-upload")
forms=mechanize.ParseResponse(response)
a.select_form(nr=0)
dosya=open("file path...","r")

我认为一切正常。

还有

print a

给出这个输出:

<Browser visiting http://www.imagebam.com/basic-upload
 selected form:
 <form POST http://www.imagebam.com/sys/upload/save multipart/form-data
  <FileControl(file[]=<No files added>)>
  <FileControl(file[]=<No files added>)>
  <FileControl(file[]=<No files added>)>
  <FileControl(file[]=<No files added>)>
  <SelectControl(content_type=[*x, 1, 0])>
  <SelectControl(thumb_size=[*100, 150, 180, 250, 300, 350])>
  <SelectControl(thumb_aspect_ratio=[crop, *resize])>
  <SelectControl(thumb_file_type=[gif, *jpg])>
  <CheckboxControl(thumb_info=[1])>
  <CheckboxControl(gallery_options=[*1])>>
>

但是当我

a["file[]"]=dosya

错误是;

Traceback (most recent call last):
  File "<pyshell#46>", line 1, in <module>
    a["file[]"]=dosya
  File "build\bdist.win32\egg\mechanize\_form.py", line 2780, in __setitem__
    control = self.find_control(name)
  File "build\bdist.win32\egg\mechanize\_form.py", line 3101, in find_control
    return self._find_control(name, type, kind, id, label, predicate, nr)
  File "build\bdist.win32\egg\mechanize\_form.py", line 3183, in _find_control
    raise AmbiguityError("more than one control matching "+description)
AmbiguityError: more than one control matching name 'file[]'

我该如何解决这个问题?

已解决

解决方法:

a.add_file(dosya,"文件名",nr=0)

自动搜索 type=file 输入并将我的文件添加到第一个(nr=0 提供)

新问题 在我发送 POST 数据后(或者我认为它发送了) 此页面作为回应;

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://developers.facebook.com/schema/" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="ImageBam.com" />
<meta name="description" content="Free Image Hosting and photo sharing. Create an online album with bulk upload tools and share with family and friends." />
<meta name="keywords" content="image hosting, free image hosting, photo sharing, upload photo, free photo gallery, photo host, image gallery" />
<meta name="robots" content="follow" />
<meta name="revisit-after" content="1 days" />
<meta property="fb:admins" content="3433880" />
<link rel="stylesheet" href="http://www.imagebam.com/style.css" type="text/css" />
<link rel="shortcut icon" href="http://www.imagebam.com/favicon.ico" />
<title>Fast, Free Image Hosting - ImageBam</title>
<script type="text/javascript" src="http://www.imagebam.com/JS/imagebam.js"></script>
<script type="text/javascript" src="http://www.imagebam.com/JS/pt.js"></script>
</head>
<body>
<!-- IMAGEBAM HEADER -->
<div class="scrollme">
<div class="abody">
<!-- everything -->
<div class="banner cursor" style="float:left;" onclick='top.location="http://www.imagebam.com"'></div>
<div style="float:right; text-align:right; border:0px solid #f2f2f2; border-top:none; padding-top: 5px; padding-left:3px; padding-right:10px;">
</div>
<div style="clear:left;"></div>
<div class="dtab">
<ul>
<li class="inactive"><a href="/">Multi-Upload</a></li>
<li class="inactive"><a href="/zip-upload">Zip-Upload</a></li>
<li class="inactive"><a href="/basic-upload">Basic Upload</a></li>
<li class="inactive"><a href="/learn-more">Learn More</a></li>
<li class="inactive"><a href="/frequently-asked-questions">FAQ</a></li>
<li class="inactive"><a href="/register">Register</a></li>
<li class="inactive"><a href="/login">Login</a></li>
<li class="inactive"><a href="/premium">Premium</a></li>
</ul>
</div><br />
<!-- Google Code for Imagebam Uploaded Image Conversion Page -->
<script type="text/javascript">
/* <![CDATA[ */
function img404(ID,fsrc){
    document.getElementById('thumb_404_info').style.display="block";
    document.getElementById("img_"+ID).style.display = "none";
    document.getElementById("alt_"+ID).style.display = "inline";
    setTimeout("reloadImg("+ID+",'"+fsrc+"')", 500);
}

function reloadImg(ID,fsrc){
    mrand = Math.random();
    document.getElementById("img_"+ID).style.display = "inline";
    document.getElementById("alt_"+ID).style.display = "none";
    document.getElementById("img_"+ID).src = fsrc+"?"+mrand;
}


/* ]]> */
</script>
<div class="box_wait" style="text-align:center; display:none;" id="thumb_404_info">Thumbnails that are being processed in the background might not load right away.<br /></div>
<div style="text-align:center; margin-bottom:5px;">
<a href="http://videobam.com" target="_blank" style="font-weight:bold; font-size:22px; text-align:center; color:#0174B3;"><b>NEW!</b> VideoBam.com (HD Video Hosting)</a>
</div>
<fieldset><legend><img src="/img/icons/photos.png" alt="" style="vertical-align:middle; line-height:16px; height:16px; padding-right:5px;" /> All at Once</legend>
<table style="width:100%;"><tr>
<td>
<b>BB-Code</b><br />
<textarea onclick="this.select();" style="width:300px; height:200px;"></textarea>
</td>
<td>
<b>HTML-Code</b><br />
<textarea onclick="this.select();" style="width:300px; height:200px;"></textarea>
</td>
</tr>
</table>
</fieldset>
<!--
<fieldset><legend style='color:green;'><img src='/img/icons/new.png' alt='' style='vertical-align:middle; line-height:16px; height:16px; padding-right:5px;'> NEW! ImageBam Remote Upload Widget</legend>
<b>Webmasters / Mods!</b><br> Allow your users to upload images to ImageBam <b>without leaving your website or forum!</b><br> Add our new <a href="/remote-upload-widget" target="_blank">ImageBam Remote Upload Widget</a> to you website!<br>
Please spread the word! Thank you!
</fieldset>
-->
<div style="text-align:center; margin-bottom:5px;">
<a href="http://videobam.com" target="_blank" style="font-weight:bold; font-size:22px; text-align:center; color:#0174B3;"><b>NEW!</b> VideoBam.com (HD Video Hosting)</a>
</div>
<fieldset><legend><img src="/img/icons/delete.png" alt="" style="vertical-align:middle; line-height:16px; height:16px; padding-right:5px;" /> All Removal Links</legend>
    Do not share the links below. You can use them to delete the photos you have uploaded.<br />
<textarea onclick="this.select()" style="width:600px; height:200px;"></textarea>
</fieldset>
<!-- Google Code for Imagebam Uploaded Image Conversion Page -->
<script type="text/javascript">
/* <![CDATA[ */
var google_conversion_id = 1068053810;
var google_conversion_language = "en_US";
var google_conversion_format = "3";
var google_conversion_color = "ffffff";
var google_conversion_label = "6tqpCPa-chCy6qT9Aw";
var google_conversion_value = 0;
/* ]]> */
</script>
<script type="text/javascript" src="http://www.googleadservices.com/pagead/conversion.js">
</script>
<noscript>
<div style="display:inline;">
<img height="1" width="1" style="border-style:none;" alt="" src="http://www.googleadservices.com/pagead/conversion/1068053810/?label=6tqpCPa-chCy6qT9Aw&amp;guid=ON&amp;script=0" />
</div>
</noscript>
</div>
<div class="footer">
<a class="footera" href="http://www.imagebam.com/">ImageBam</a> | <a class="footera" href="/remote-upload-widget">Remote Upload Widget</a> | <a class="footera" href="http://www.imagebam.com/screengrab_upload_firefox_extension">screengrab tool</a> | <a class="footera" href="http://www.imagebam.com/terms-of-service">terms of service</a> | <a class="footera" href="http://www.imagebam.com/frequently-asked-questions">help</a> | <a class="footera" href="http://support.imagebam.com" target="_blank">support forums</a> | <a class="footera" href="http://code.google.com/p/imagebam-api/">API for developers</a> | <a class="footera" href="http://www.imagebam.com/report-abuse">report abuse</a>
<div style="height:35px; overflow:hidden;">
<div id="google_translate_element" style="margin-top:9px;"></div><script type="text/javascript">
function googleTranslateElementInit() {
  new google.translate.TranslateElement({
    pageLanguage: 'en'
  }, 'google_translate_element');
}
</script><script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit" type="text/javascript"></script>
</div>
<div style="text-align:center; color:#999; margin-top:10px;">
<table style="margin:auto;"><tr><td><img src="http://1.imagebam.com/static/img/tux.png" alt="tux" /></td><td>Powered by dedicated Linux servers. Flixya Entertainment, LLC &copy; 2010</td></tr></table>
</div>
</div>
</div>
<div id="updater_index"></div>
<script type="text/javascript">
</script>
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2424497-2";
urchinTracker();
</script>
</body>
</html>

一般情况下,上传后的页面会出现图片的链接等。 但我认为这是一个动态过程,因为当我得到页面时链接还没有准备好。

我错过了什么吗?因为即使你不填写表单上的输入,如果你提交()它,它会将你重定向到上传后的页面..

最佳答案

同时使用 select_control() 和 nr=0 来选择第一个文件。

关于python - 如何在 Python 中绕过 Mechanize "AmbiguityError",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854763/

相关文章:

html - 在 chrome 中设置输入类型 ='file' 元素的高度

python - 如何使用 Mechanize 填写表格?

python - 如何在python中创建文件夹?

javascript - 准备作为第二个事件类型

javascript - 获取 html 表单信息并使用 ajax 推送到 PHP

ruby-on-rails - 使用 Mechanize 捕获 POST 请求

selenium-webdriver - Scrapy 或 Selenium 或 Mechanize 来抓取网络数据?

python - 使用 Pandas 将三个或更多数据帧合并为单个数据帧并保留空值

python - 为什么这个 lambda 操作不起作用?

python - 从 pandas DataFrame 制作热图