在python或解析html页面中从html页面提取表单键值对

时间:2012-11-17 16:53:27

标签: python html string parsing html-parsing

我想在html页面中提取某些表单元素的键值对

例如

name="frmLogin" method="POST" onSubmit="javascript:return validateAndSubmit();" action="TG_cim_logon.asp?SID=^YcMunDFDQUoWV32WPUMqPxeSxD4L_slp_rhc_rNvW7Fagp7FgH3l0uJR/3_slp_rhc_dYyJ_slp_rhc_vsPW0kJl&RegType=Lite_Home"

而原始行是

<form name="frmLogin" method="POST" onSubmit="javascript:return validateAndSubmit();" action="TG_cim_logon.asp?SID=^YcMunDFDQUoWV32WPUMqPxeSxD4L_slp_rhc_rNvW7Fagp7FgH3l0uJR/3_slp_rhc_dYyJ_slp_rhc_vsPW0kJl&RegType=Lite_Home">

是否有任何方法可以安全地获取键和值对。我尝试使用空格拆分然后使用'='字符,但引号内的字符串也可以有'='。

是否有任何不同类型的拆分方法也可以处理报价?

6 个答案:

答案 0 :(得分:7)

使用解析库(例如lxml.html)来解析html。

图书馆将有一种简单的方式让您获得所需的资源,可能不会采取以下几个步骤:

  1. 使用解析器加载页面

  2. 选择要在

  3. 上操作的表单元素
  4. 询问您想要的数据

  5. 示例代码:

    >>> import lxml.html
    >>> doc = lxml.html.parse('http://stackoverflow.com/questions/13432626/split-a-s
    tring-in-python-taking-care-of-quotes')
    >>> form = doc.xpath('//form')[0]
    >>> form
    <Element form at 0xbb1870>
    >>> form.attrib
    {'action': '/search', 'autocomplete': 'off', 'id': 'search', 'method': 'get'}
    

答案 1 :(得分:2)

你可以使用像这样的正则表达式:

/([^=, ]+)="([^" ]+|[^," ]+)" ?"/

在python中,你可以这样做:

#!/usr/bin/python

import re

text = 'name="frmLogin" method="POST" onSubmit="javascript:return validateAndSubmit();" action="TG_cim_logon.asp?SID=^YcMunDFDQUoWV32WPUMqPxeSxD4L_slp_rhc_rNvW7Fagp7FgH3l0uJR/3_slp_rhc_dYyJ_slp_rhc_vsPW0kJl&RegType=Lite_Home"';

ftext = re.split( r'([^=, ]+)="([^" ]+|[^," ]+)" ?', text )

print ftext;

答案 2 :(得分:1)

s = r'name="frmLogin" method="POST" onSubmit="javascript:return validateAndSubmit();" action="TG_cim_logon.asp?SID=^YcMunDFDQUoWV
32WPUMqPxeSxD4L_slp_rhc_rNvW7Fagp7FgH3l0uJR/3_slp_rhc_dYyJ_slp_rhc_vsPW0kJl&RegType=Lite_Home"'
>>> lst = s.split('" ')
>>> for item in lst:
...     print item.split('="')
... 
['name', 'frmLogin']
['method', 'POST']
['onSubmit', 'javascript:return validateAndSubmit();']
['action', 'TG_cim_logon.asp?SID=^YcMunDFDQUoWV32WPUMqPxeSxD4L_slp_rhc_rNvW7Fagp7FgH3l0uJR/3_slp_rhc_dYyJ_slp_rhc_vsPW0kJl&RegType=Li
te_Home"']

答案 3 :(得分:0)

{i.split('="')[0]: i.split('="')[1] for i in str.split("\" ")}

其中str是您的原始字符串

答案 4 :(得分:0)

dict=eval('dict(%s)'%name.replace(' ',','))
print dict
{'action': 'TG_cim_logon.asp?SID=^YcMunDFDQUoWV32WPUMqPxeSxD4L_slp_rhc_rNvW7Fagp7FgH3l0uJR/3_slp_rhc_dYyJ_slp_rhc_vsPW0kJl&RegType=Lite_Home', 'onSubmit': 'javascript:return,validateAndSubmit();', 'method': 'POST', 'name': 'frmLogin'}

这将解决您的问题。

答案 5 :(得分:0)

可以使用具有用于解析HTML表单支持库。

例如:https://mechanize.readthedocs.io/en/latest/

<块引用>

在Python编程有状态网络浏览。编程浏览网页方便HTML表单填充和链接点击。