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

在python中从html页面提取表单键值对或解析html页面,python,html,string,parsing,html-parsing,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"

我想在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中,可以执行以下操作:

#!/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;

使用解析库(如用于解析html)

图书馆将为您提供一种获取所需内容的简单方法,可能只需几个步骤:

  • 使用解析器加载页面

  • 选择要操作的表单元素

  • 询问你想要的数据

  • 示例代码:

    >>> 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'}
    
    导入lxml.html >>>doc=lxml.html.parse('http://stackoverflow.com/questions/13432626/split-a-s python中的字符串处理引号') >>>form=doc.xpath('//form')[0] >>>形式 >>>表1.attrib {'action':'/search','autocomplete':'off','id':'search','method':'get'} 其中
    str
    是原始字符串

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

    这将解决您的问题。

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

    例如:

    Python中的有状态编程web浏览。通过简单的HTML表单填充和点击链接以编程方式浏览页面


    转义双引号可能会在这里造成问题。@JanDvorak我从未在HTML中见过任何引号转义,但事实上,这可能是个问题……如果搜索表单输入元素的值(而不是属性),则此答案适用:
    {i.split('="')[0]: i.split('="')[1] for i in str.split("\" ")}
    
    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'}