我在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
,我已经把它弄得一团糟。
答案 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(' ', '')