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"])
大家看, 有没有更简单的方式? 展开
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"])
大家看, 有没有更简单的方式? 展开
2个回答
展开全部
那要看你submit哪个form罗。
如果你要传回下面的form的input的话,你应该submit下面的form,不是上面的。
如果你要submit上面的form的时候,一拼把下面的form的资料也一起传回,那你得用javascript帮忙,不是单单靠python就可以做得到。在submit上面的form的时候,你要先用javascript把下面的form的input value抄写一份到上面的form,然後submit时,所有资料都会齐全
如果你要传回下面的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那边是帮不了什麼忙
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询