用Python从html中提取电话号码

用Python从html中提取电话号码,python,beautifulsoup,Python,Beautifulsoup,在用户单击电话号码“5551437662”之前,该电话号码一直处于隐藏状态(555143…),但位于onclick参数中。。。我可以使用什么选项从下面的HTML中获取电话号码 <html> <body> <h3 id="resultTelBar"> <span onclick="showFullNumber(this, '555 1437662'); dcsMultiTrac

在用户单击电话号码“5551437662”之前,该电话号码一直处于隐藏状态(555143…),但位于
onclick
参数中。。。我可以使用什么选项从下面的HTML中获取电话号码

<html>
    <body>
        <h3 id="resultTelBar">
            <span onclick="showFullNumber(this, '555 1437662');
                dcsMultiTrack('DCSext._mainreq','','DCSext.linktype',
                'telephone show','DCSext.linkplace','','DCSext.linkvalue','555 1437662',
                'DCSext.show_listingId','SA_6597739_4638_003722_8396251_IYMX',
                DCSext.show_zoningUsed','0','DCSext.show_resultNumber','1')"
                >086 143 ....</span>
        </h3>
    </body>
</html>

086 143 ....

信息嵌入在脚本中,该脚本作为字符串包含在标记属性中?那是。。。非常不幸

(编辑:为了澄清,我假设这里的问题是“如果这个不幸的html/javascript作为输入,我如何用BeautifulSoup解析电话号码”。如果这是错误的,请给出建议。)

我认为最简单的方法是分离javascript字符串,然后使用正则表达式提取数字。然而,正则表达式部分将是一个PITA,并且相当脆弱


soup.find('h3',id='resultTelBar').span['onclick']
将获取字符串,假设soup是BeautifulSoup对象。然后使用
re.search
解析第一行中的数字。您使用的确切正则表达式取决于结果的规则性(每个javascript字符串是否都以这种方式格式化,包括换行符?等等),以及您需要它的健壮性(例如,外国电话号码),或者,如果此数据的未来版本中的javascript稍微调整。

我注意到了
beautyfulsoup
标记,但建议您使用我的变体。 如果你愿意,你可以用它。我不太关心正则表达式,如果它在某些情况下不起作用,您可以对其进行改进

>>> import re
>>> from lxml import etree
>>> etree.fromstring(u'''YOUR HTML''')
>>> onclick = html.xpath('//h3[@id="resultTelBar"]/span/@onclick')[0]
>>> print re.search("showFullNumber\(this,\s*'([\d ]+)'", onclick).group(1)
555 1437662