html里多个form时, 取出form跟它下面的所有指定类型的input元素?

#coding=utf-8fromlxmlimportetreehtml='''<html><body><ahref="http://www.baidu.com/"tar... #coding=utf-8
from lxml import etree
html = '''
<html>
  <body>
    <a href="http://www.baidu.com/" target="_blank">91wan游戏</a>
<form action="/find.do">
<span class="s_ipt_wr">
<input type="text" name="wd" id="kw" maxlength="100" class="s_ipt" autocomplete="off">
</span>
<input type="hidden" name="rsv_bp" value="0">
<div>
<span>
<input type="hidden" name="ie" value="utf-8">
<div>
<input type="text" name="wd" id="kw" maxlength="100" class="s_ipt" autocomplete="off">
</div>
</span>
</div>
<div class="s_btn_wr">
<input type="submit" value="百度一下" id="su" class="s_btn" onmousedown="this.className='s_btn s_btn_h'" onmouseout="this.className='s_btn'">
</div>
<span class="s_btn_wr">
<input type="submit" value="百度一下" id="su" class="s_btn" onmousedown="this.className='s_btn s_btn_h'" onmouseout="this.className='s_btn'">
</span>
<div id="sd_1363580690288" style="display: none;"></div>
</form>
<form name="f" action="/search.do">
<span class="s_ipt_wr">
<input type="text" name="wd" id="kw" maxlength="100" class="s_ipt" autocomplete="off">
</span>
<input type="hidden" name="rsv_bp" value="0">
<div>
<span>
<input type="hidden" name="ie" value="utf-8">
<div>
<input type="text" name="wd" id="kw" maxlength="100" class="s_ipt" autocomplete="off">
</div>
</span>
</div>
</form>
  </body>
</html>
'''
page = etree.HTML(html.lower().decode('utf-8'))
def getEle(page, xpath):
inputHiddenInForms = page.xpath(xpath)
print "size: " + `len(inputHiddenInForms)`
for input in inputHiddenInForms:
print input.attrib
print"text>>>>>>>>>"
getEle(page, u"//form//input[@type='text' or @type='hidden']");

上面的Python代码, 只能取到form下所有的input标签(text或hidden类型的), 但怎么把input外面的form也取出来呢? 要对应关系?
现在我用下面的方式拿到了, 不过感觉有些绕:

page = lxml.html.fromstring(html.lower().decode('utf-8'));
forms = page.forms
print "size: " + `len(forms)`
dir = {}
for f in forms:
actionName = f.action
# print actionName
formHTMlContent = tostring(f)
# print formHTMlContent
page = etree.HTML(formHTMlContent)
inputs = page.xpath(u"//form//input[@type='text' or @type='hidden']")
# dir.put(actionName, inputs)
# dir.update({actionName, inputs})
dir['"'+actionName+'"'] = inputs
#print str(dir)
for k, v in dir.iteritems():
print "action value: " + k
for input in v:
print "input " + str(input.attrib["name"])

大家看, 有没有更简单的方式?
展开
 我来答
work4brains
2013-03-18 · TA获得超过469个赞
知道答主
回答量:198
采纳率:0%
帮助的人:166万
展开全部
那要看你submit哪个form罗。

如果你要传回下面的form的input的话,你应该submit下面的form,不是上面的。

如果你要submit上面的form的时候,一拼把下面的form的资料也一起传回,那你得用javascript帮忙,不是单单靠python就可以做得到。在submit上面的form的时候,你要先用javascript把下面的form的input value抄写一份到上面的form,然後submit时,所有资料都会齐全
追问
多谢啦。 

不过, 这里边没有JavaScript和浏览器的什么事, 完全是用Python语言解析了。
追答
就是这个问题,就是因为你只用python才有问题

python是server side运作的,而javascript是client side运作的。每一次submit form的时候,就是要从client side传回资给server side。现在你需要的是从client side收集好资料後才submit到server side。你单单用python,在server side那边是帮不了什麼忙
_私领地_
2013-03-19 · TA获得超过676个赞
知道小有建树答主
回答量:367
采纳率:0%
帮助的人:63.6万
展开全部
不太懂这个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式