2012-11-17 24 views
5

我想提取某種形式的元素的密鑰值對在一個HTML頁面提取物形式的鍵值對形成html頁面在Python或解析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"> 

是有使用,我可以放心地拿到鑰匙和值對任何方法。我嘗試使用空格拆分,然後使用'='字符,但引號內的字符串也可以具有'='。

是否有任何不同類型的拆分方法,也可以照顧引號?

回答

7

使用解析庫如lxml.html分析HTML。

圖書館將有一個簡單的方法可以讓你得到你所需要的東西,大概沒有超過幾步承擔更多:使用分析器

  • 選擇表單元素

    1. 加載頁面對

    2. 操作索要數據你想

    示例代碼:

    >>> 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; 
    
    +0

    轉義雙引號可能會造成問題。 –

    +0

    @JanDvorak我從來沒有見過任何引號在HTML中轉義,但的確,這可能是一個問題... – rayfranco

    +0

    [Obligatory](http://stackoverflow.com/a/1732454/566644)。 –

    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"'] 
    
    0
    {i.split('="')[0]: i.split('="')[1] for i in str.split("\" ")} 
    

    其中str是你的原始字符串

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

    這將解決您的問題。