无法解析电话号码和地址

时间:2017-11-07 22:41:59

标签: python string python-3.x web-scraping css-selectors

我在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>
    '''

表达式和脚本我用来解析电话号码:

from lxml.html import fromstring

tree = fromstring(html_content)
phone = ' '.join([elem.text_content().strip().split()[-2] for elem in tree.cssselect("div")])
phone1 = ' '.join([elem.text_content().strip().split()[-1] for elem in tree.cssselect("div")])
print(phone+phone1)

结果:

(330)971-7456

顺便说一下,地址是Lyndhurst, OH,电话号码是(330)971-7456,我已经把它弄得一团糟。

4 个答案:

答案 0 :(得分:1)

另一种方法可以做到:

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

答案 1 :(得分:0)

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

,而不是操纵tree.cssselect("div")返回的值
tree.cssselect("div > br:nth-child(3)")

当您访问其文本时,应返回“(330)971-7456”。 >访问父级的元素,例如div > br选择父级为<br>元素的所有<div>个元素,“3”指定父级的第3个子级。有关详细信息,请参阅here

这可以在这个简单的情况下使用,但是如果div > br:nth-child(3)指定了多个元素,则可能会遇到问题,例如,如果有<div><br>csv_customerdata.writerow(row) 的。在这种情况下,CSS选择器应返回多个值(在列表或其他内容中),并且您希望遍历所有值并提取每个电话号码。 免责声明:我没有使用lxml.html库,我还没有研究cssselect()的预期功能是什么,所以这里没有保证。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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