【问题标题】:Extract form key value pairs form html page in python or parse html page在python中提取表单键值对表单html页面或解析html页面
【发布时间】:2012-11-06 03:00:00
【问题描述】:

我想提取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">

有什么方法可以让我安全地获取键值对。我尝试使用空格分割,然后使用'='字符,但引号内的字符串也可以有'='。

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

【问题讨论】:

标签: python html string parsing html-parsing


【解决方案1】:

使用lxml.html等解析库来解析html。

该库将为您提供一种简单的方法来获得所需的内容,可能只需几个步骤即可:

  1. 使用解析器加载页面

  2. 选择要操作的表单元素

  3. 询问你想要的数据

示例代码:

>>> 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'}

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 转义的双引号可能会造成问题。
    • @JanDvorak 我从未在 HTML 中看到任何引号转义,但实际上,这可能是个问题......
    【解决方案3】:
    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"']
    

    【讨论】:

      【解决方案4】:
      {i.split('="')[0]: i.split('="')[1] for i in str.split("\" ")}
      

      str 是你的原始字符串

      【讨论】:

        【解决方案5】:
        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'}
        

        这会解决你的问题。

        【讨论】:

          【解决方案6】:

          您可以使用支持解析 HTML 表单的库。

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

          Python 中的有状态程序化网页浏览。使用简单的 HTML 表单填写和单击链接以编程方式浏览页面。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-21
            • 2012-07-23
            • 2012-01-06
            • 1970-01-01
            • 1970-01-01
            • 2014-06-01
            • 2012-11-11
            • 1970-01-01
            相关资源
            最近更新 更多