Python 无法分析电话号码和地址

Python 无法分析电话号码和地址,python,string,python-3.x,web-scraping,css-selectors,Python,String,Python 3.x,Web Scraping,Css Selectors,我用python编写了一个脚本,从一些元素中获取电话号码和地址。问题是我试图解析电话号码的方式肯定很混乱。我可以为地址做同样的事情。然而,有没有更干净或更好的方法 嵌入数据的元素: html_content=''' <div style=""> <strong>Pamela Banchy, Chief Information Officer</strong> <br>Western Reserve H

我用python编写了一个脚本,从一些元素中获取电话号码和地址。问题是我试图解析电话号码的方式肯定很混乱。我可以为地址做同样的事情。然而,有没有更干净或更好的方法

嵌入数据的元素:

html_content='''
    <div style="">
        <strong>Pamela Banchy, Chief Information Officer</strong>
            <br>Western Reserve Hospital<br> 
            <br>Lyndhurst, OH <br>
                <a href="mailto:pbanchy@westernreservehospital.org">pbanchy@westernreservehospital.org</a>
            <br>(330) 971-7456<br>
    </div>
    '''
结果:

(330)971-7456

顺便说一句,地址是
Lyndhurst,哦
,电话号码是
(330)971-7456
,我已经用一种混乱的方式抓到了它。

你可以尝试使用更具体的CSS选择器。您可以使用

tree.cssselect("div > br:nth-child(3)")
当您访问其文本时,应返回“(330)971-7456”。
访问父元素,例如
div>br
选择父元素为
元素的所有

元素,“3”指定父元素的第三个子元素。有关更多详细信息,请参阅


在这种简单的情况下,这将起作用,但是如果有多个元素由
div>br:nth child(3)
指定,例如如果有两组

一起指定,则可能会遇到问题。在这种情况下,CSS选择器应该返回多个值(在一个列表或其他东西中),您可能希望遍历所有值并提取每个电话号码。免责声明:我没有使用lxml.html库,也没有研究cssselect()的预期函数,因此这里没有保证。

我认为更好的方法是使用xpath。
address,phone=tree.xpath('./div/br/text()')[-2:]

您可以通过换行来拆分文本,这样您就可以用最少的后期处理更方便地获取地址和电话号码

for elem in tree.cssselect('div'):
    elem = elem.text_content().split('\n')
    address = elem[-4].strip()
    phone = elem[-2].replace(' ', '')

另一种方法是:

text_nodes = [node for node in tree.cssselect('div')[0].itertext() if node.split()]
adress, phone = text_nodes[2], text_nodes[4]

你有很多相似的标签来提取信息吗?还是只有这一个?很多相似的br标签,但共同点是电话号码在最后一个位置,地址在最后三个位置。你的选择器没有任何意义。不过谢谢你的尝试!在看了更多的HTML代码之后,我意识到它也需要一些澄清。例如,

你好,
本身就没有意义。应该是

你好
。在意识到缩进令人困惑之后,我编辑了CSS选择器。请提供一个更清楚的例子!看到你的选择器我真的很困惑。为什么要在br标记的基础上创建选择器呢。这是断线。哦!我假设,既然您谈论的是HTML,那么

就是一个元素。您可能已经知道,HTML标记被
包围,我将接受它作为一个答案,因为您已经向我展示了如何使用它。我有个主意,做一行<代码>地址=“”.join([elem.text_content().strip().split('\n')[-3]表示树中的元素。cssselect(“div”))
电话=“”.join([elem.text_content().strip().split('\n')[-1]表示树中的元素。cssselect(“div”)])
@Shahin我这样写的,因为我假设您想从每个div标记中分别提取地址和号码。您的一行程序将把所有地址和所有电话号码连接在一起。这很好,如果你想要的话。顺便说一下,当地址本身可以包含空格时,您可能需要注意将地址与空格连接起来。谢谢您所做的一切。这种风格对我来说是全新的,先生。是的,它能做到。谢谢,先生。在这种情况下,您的解决方案是最好的。只有两行代码可以获取5个单独的结果。再次感谢,先生。请注意,如果您想将所有5个文本节点分配给5个不同的变量,您可以使用语法
名称、工作、地址、电子邮件、电话=text\u节点
text_nodes = [node for node in tree.cssselect('div')[0].itertext() if node.split()]
adress, phone = text_nodes[2], text_nodes[4]