Python HTML表单有一个javascript生成的单选按钮。有没有办法使用mechanize解决这个问题?

Python HTML表单有一个javascript生成的单选按钮。有没有办法使用mechanize解决这个问题?,python,mechanize,Python,Mechanize,不管出于什么原因,我使用javascript的document.write在页面上绘制单选按钮,我不知道如何绕过它 在这里和Google上进行了一些搜索之后,您似乎可以使用Mechanize手动重新创建表单字段,然后像往常一样提交它 因此,我将代码设置如下: br = mechanize.Browser(factory=mechanize.RobustFactory()) response = br.open(url) br.select_form(nr=0) br.form.set_all_r

不管出于什么原因,我使用javascript的
document.write
在页面上绘制单选按钮,我不知道如何绕过它

在这里和Google上进行了一些搜索之后,您似乎可以使用Mechanize手动重新创建表单字段,然后像往常一样提交它

因此,我将代码设置如下:

br = mechanize.Browser(factory=mechanize.RobustFactory())
response = br.open(url)
br.select_form(nr=0)
br.form.set_all_readonly(False)
br.form.new_control('radio', 'DATASOURCE', {'value':'FILE', 'checked':'true'})
br.form.add_file(open('weather_info.csv'), 'text/csv', 'weather_info.csv', name='FILENAME')
br.form.fixup()
response = br.submit() 
现在,如果我打印表单,它确实会显示为底部的一个字段

<HiddenControl(CGIREF=/calludt.cgi/DDFILE1)>
  <HiddenControl(USE=MODEL)>
  <HiddenControl(MODEL=CM)>
  <HiddenControl(CROP=apples)>
  <HiddenControl(METHOD=SS)>
  <HiddenControl(UNITS=E)>
  <HiddenControl(LOWTHRESHOLD=50)>
  <HiddenControl(UPTHRESHOLD=88)>
  <HiddenControl(CUTOFF=H)>
  <SelectControl(COUNTY=[])>
  <CheckboxControl(ACTIVE=[*Y])>
  <SelectControl(FROMMONTH=[1, 2, *3, 4, 5, 6, 7, 8, 9, 10, 11, 12])>
  <SelectControl(FROMDAY=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, *15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])>
  <SelectControl(FROMYEAR=[2014, *2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1995, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1976, 1975, 1974, 1973, 1972, 1971, 1970, 1969, 1968, 1967, 1966, 1965, 1964, 1963, 1962, 1961, 1960, 1959, 1958, 1957, 1956, 1955, 1954, 1953, 1952, 1951])>
  <SelectControl(THRUMONTH=[1, 2, 3, 4, *5, 6, 7, 8, 9, 10, 11, 12])>
  <SelectControl(THRUDAY=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, *12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])>
  <SelectControl(THRUYEAR=[2014, *2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1995, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1986, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1976, 1975, 1974, 1973, 1972, 1971, 1970, 1969, 1968, 1967, 1966, 1965, 1964, 1963, 1962, 1961, 1960, 1959, 1958, 1957, 1956, 1955, 1954, 1953, 1952, 1951])>
  <FileControl(FILENAME=weather_scrape.csv)>
  <IgnoreControl(Submit=<None>)>
  <RadioControl(DATASOURCE=[*FILE])>>
我尝试在表单中手动添加一个按钮,如图所示

但还是没有运气

Submit
onclick
方法调用以下函数:

function SetDDinfo(){
     var DDstuff = new Array(21);
     var checksok = true;
     // alert("SetDDinfo DDparms: " + DDparms);
     for (var i = 0; i < 21; i++){
       DDstuff[i] = DDparms[i];
     }
     // This section for MODEL
        document.DDCOMPUTE.USE.value = "MODEL";
        DDstuff[4] = "MODEL"
        with(document.DDCOMPUTE) {
          DDstuff[5] = "E";  // english units
          DDstuff[6] = "";  // lower threshold (null)
          DDstuff[7] = "";   // upper threshold (null)
          DDstuff[8] = "SS"; // dd method: (default)
          DDstuff[9] = "H"; // cutoff: (default)
          DDstuff[10] = "CM";         // organism model code: CM, NOW, etc.
          if (COUNTY.selectedIndex < 0) {
             DDstuff[11] = "";
          } else {
             DDstuff[11] = COUNTY.options[COUNTY.selectedIndex].value;  // county
          }
          if (DATASOURCE[0].checked == "1") {
             DDstuff[13] = "STATION";  // data from database
             DDstuff[14] = "";
          } else {
             if (DATASOURCE[1].checked == "1") {
                DDstuff[13] = "FILE";  // data from user file
                DDstuff[14] = FILENAME.value;
             } else {
                DDstuff[13] = "ENTRY";  // data from user entry
                DDstuff[14] = "";
             }
          }
        }
        // MODEL error checks. Return false to abort SUBMIT.
        if (DDstuff[11] == "" && DDstuff[13] == "STATION") {
           alert ("ERROR: You must select a County.");
           checksok = false;
           return checksok
        }
        if (DDstuff[10] == "") {
           alert ("ERROR: You must select a Model.");
           checksok = false;
           return checksok
        }
        if (DDstuff[13] == "FILE" && DDstuff[14] == "") {
           alert ("ERROR: You must specify a filename.");
           checksok = false;
           return checksok
        }
        // Wx source error checks. Return false to abort SUBMIT.
        if (DDstuff[11] == "" && DDstuff[13] == "STATION") {
           alert ("ERROR: You must select a County.");
           checksok = false;
           return checksok
        }
        if (DDstuff[13] == "FILE" && DDstuff[14] == "") {
           alert ("ERROR: You must specify a filename.");
           checksok = false;
           return checksok
        }

     DDstuff[14] = "";     // Don't bother saving filename, since not displayed and must be re-specified.
     var DDitems = DDstuff.join(",");
     SetCookie ('DDinfo', DDitems, exp);
        // alert ("DDstuff[13]: "+DDstuff[13]);
        if (DDstuff[13] == "STATION") {
           document.DDCOMPUTE.action = "/calludt.cgi/DDSTATIONLIST";
           document.DDCOMPUTE.method = "GET";
           document.DDCOMPUTE.encoding = "application/x-www-form-urlencoded";
        } else {
           if (DDstuff[13] == "FILE") {
              document.DDCOMPUTE.action = "/WEATHER/textupload.cgi";
              document.DDCOMPUTE.method = "POST";
              document.DDCOMPUTE.encoding = "multipart/form-data";
           } else {
              document.DDCOMPUTE.action = "/calludt.cgi/DDENTRY1";
              document.DDCOMPUTE.method = "GET";
              document.DDCOMPUTE.encoding = "application/x-www-form-urlencoded";           }
        }
        // alert ("document.DDCOMPUTE.action = " + document.DDCOMPUTE.action);
        document.DDCOMPUTE.submit()
     return checksok
   }  // ................................................
函数SetDDinfo(){
var DDstuff=新阵列(21);
var checksok=true;
//警报(“SetDDinfo DDparms:+DDparms”);
对于(变量i=0;i<21;i++){
DDstuff[i]=DDparms[i];
}
//本节为模型
document.DDCOMPUTE.USE.value=“MODEL”;
DDstuff[4]=“模型”
with(document.DDCOMPUTE){
DDstuff[5]=“E”;//英制单位
DDstuff[6]=“”;//下限阈值(null)
DDstuff[7]=“”;//上限阈值(null)
DDstuff[8]=“SS”;//dd方法:(默认)
DDstuff[9]=“H”;//截止:(默认)
DDstuff[10]=“CM”;//生物体模型代码:CM、NOW等。
如果(COUNTY.selectedIndex<0){
DDstuff[11]=“”;
}否则{
DDstuff[11]=country.options[country.selectedIndex].value;//country
}
如果(数据源[0]。选中==“1”){
DDstuff[13]=“站”;//来自数据库的数据
DDstuff[14]=“”;
}否则{
if(数据源[1]。选中==“1”){
DDstuff[13]=“文件”;//来自用户文件的数据
DDstuff[14]=FILENAME.value;
}否则{
DDstuff[13]=“条目”;//来自用户条目的数据
DDstuff[14]=“”;
}
}
}
//模型错误检查。返回false以中止提交。
中频(DDstuff[11]=“和&DDstuff[13]=“站”){
警报(“错误:您必须选择一个县。”);
checksok=false;
返回支票
}
如果(DDstuff[10]=“”){
警报(“错误:您必须选择一个模型”);
checksok=false;
返回支票
}
if(DDstuff[13]=“文件”&&DDstuff[14]=“文件”){
警报(“错误:必须指定文件名”);
checksok=false;
返回支票
}
//Wx源错误检查。返回false以中止提交。
中频(DDstuff[11]=“和&DDstuff[13]=“站”){
警报(“错误:您必须选择一个县。”);
checksok=false;
返回支票
}
if(DDstuff[13]=“文件”&&DDstuff[14]=“文件”){
警报(“错误:必须指定文件名”);
checksok=false;
返回支票
}
DDstuff[14]=“”;//不要麻烦保存文件名,因为文件名不显示,必须重新指定。
var DDitems=DDstuff.join(“,”);
SetCookie('DDinfo',DDitems,exp);
//警报(“DDstuff[13]:”+DDstuff[13]);
中频(DDSTUF[13]=“站”){
document.DDCOMPUTE.action=“/calludt.cgi/DDSTATIONLIST”;
document.DDCOMPUTE.method=“GET”;
document.DDCOMPUTE.encoding=“应用程序/x-www-form-urlencoded”;
}否则{
if(DDstuff[13]=“文件”){
document.DDCOMPUTE.action=“/WEATHER/textupload.cgi”;
document.DDCOMPUTE.method=“POST”;
document.DDCOMPUTE.encoding=“多部分/表单数据”;
}否则{
document.DDCOMPUTE.action=“/calludt.cgi/DDENTRY1”;
document.DDCOMPUTE.method=“GET”;
document.DDCOMPUTE.encoding=“应用程序/x-www-form-urlencoded”;}
}
//警报(“document.DDCOMPUTE.action=“+document.DDCOMPUTE.action”);
document.DDCOMPUTE.submit()
返回支票
}  // ................................................

我不擅长javascript,但函数的前半部分似乎处理的是我不感兴趣的表单部分——当单选按钮处于位置
one
时。第二点对我来说很难理解,但它正在向
/WEATHER/textfupload.cgi发布帖子,我明天必须查看流量。也许我可以通过
urllib2
或其他方式重新创建它需要的东西

SetDDinfo()
有什么作用?@chmullig我已经用这个函数更新了这个问题。简言之,对于适用的部分,它似乎只是发出一个
post
请求。如果你能找出它发布到哪里的格式,那么你可能可以更容易地找到你需要发布的内容,然后这样做。不过,我建议使用urllib2,而不是
urllib2
。这是一个更友好、更好的图书馆。
br.form.new_control('submit', 'Button', {}) 
function SetDDinfo(){
     var DDstuff = new Array(21);
     var checksok = true;
     // alert("SetDDinfo DDparms: " + DDparms);
     for (var i = 0; i < 21; i++){
       DDstuff[i] = DDparms[i];
     }
     // This section for MODEL
        document.DDCOMPUTE.USE.value = "MODEL";
        DDstuff[4] = "MODEL"
        with(document.DDCOMPUTE) {
          DDstuff[5] = "E";  // english units
          DDstuff[6] = "";  // lower threshold (null)
          DDstuff[7] = "";   // upper threshold (null)
          DDstuff[8] = "SS"; // dd method: (default)
          DDstuff[9] = "H"; // cutoff: (default)
          DDstuff[10] = "CM";         // organism model code: CM, NOW, etc.
          if (COUNTY.selectedIndex < 0) {
             DDstuff[11] = "";
          } else {
             DDstuff[11] = COUNTY.options[COUNTY.selectedIndex].value;  // county
          }
          if (DATASOURCE[0].checked == "1") {
             DDstuff[13] = "STATION";  // data from database
             DDstuff[14] = "";
          } else {
             if (DATASOURCE[1].checked == "1") {
                DDstuff[13] = "FILE";  // data from user file
                DDstuff[14] = FILENAME.value;
             } else {
                DDstuff[13] = "ENTRY";  // data from user entry
                DDstuff[14] = "";
             }
          }
        }
        // MODEL error checks. Return false to abort SUBMIT.
        if (DDstuff[11] == "" && DDstuff[13] == "STATION") {
           alert ("ERROR: You must select a County.");
           checksok = false;
           return checksok
        }
        if (DDstuff[10] == "") {
           alert ("ERROR: You must select a Model.");
           checksok = false;
           return checksok
        }
        if (DDstuff[13] == "FILE" && DDstuff[14] == "") {
           alert ("ERROR: You must specify a filename.");
           checksok = false;
           return checksok
        }
        // Wx source error checks. Return false to abort SUBMIT.
        if (DDstuff[11] == "" && DDstuff[13] == "STATION") {
           alert ("ERROR: You must select a County.");
           checksok = false;
           return checksok
        }
        if (DDstuff[13] == "FILE" && DDstuff[14] == "") {
           alert ("ERROR: You must specify a filename.");
           checksok = false;
           return checksok
        }

     DDstuff[14] = "";     // Don't bother saving filename, since not displayed and must be re-specified.
     var DDitems = DDstuff.join(",");
     SetCookie ('DDinfo', DDitems, exp);
        // alert ("DDstuff[13]: "+DDstuff[13]);
        if (DDstuff[13] == "STATION") {
           document.DDCOMPUTE.action = "/calludt.cgi/DDSTATIONLIST";
           document.DDCOMPUTE.method = "GET";
           document.DDCOMPUTE.encoding = "application/x-www-form-urlencoded";
        } else {
           if (DDstuff[13] == "FILE") {
              document.DDCOMPUTE.action = "/WEATHER/textupload.cgi";
              document.DDCOMPUTE.method = "POST";
              document.DDCOMPUTE.encoding = "multipart/form-data";
           } else {
              document.DDCOMPUTE.action = "/calludt.cgi/DDENTRY1";
              document.DDCOMPUTE.method = "GET";
              document.DDCOMPUTE.encoding = "application/x-www-form-urlencoded";           }
        }
        // alert ("document.DDCOMPUTE.action = " + document.DDCOMPUTE.action);
        document.DDCOMPUTE.submit()
     return checksok
   }  // ................................................