我正在尝试使用lxml etree
从一个标签中获取文字。
<div class="litem__type">
<div>
Robbp
</div>
<div>Estimation</div>
+487 (0)639 14485653
•
<a href="mailto:herbrich@gmail.com">
Email Address
</a>
•
<a class="external" href="http://www.google.com">
Homepage
</a>
</div>
问题在于我找不到它,因为这种片段之间存在很多差异。有些情况下,第一个和第二个div
根本不存在。如您所见,电话号码不在其自己的div
中。
我认为可以使用BeautifulSoups
内容提取电话,但我正在尝试使用lxml
模块的xpath
。
你有什么想法吗? (电子邮件有时不一定在那里)
编辑:最好的想法可能是使用regex
,但我不知道如何告诉它它应该只在两个<div></div>
之间提取文本
答案 0 :(得分:0)
您应该尽可能避免使用正则表达式来解析XML / HTML,因为它不如使用元素树那么有效。
元素A的结束标记之后但在元素B的开始标记之前的文本称为元素A的tail
文本。要使用tail
选择此lxml etree
文字,您可以执行以下操作:
content = '''
<div class="litem__type">
<div>Robbp</div>
<div>Estimation</div>
+487 (0)639 14485653
<a href="mailto:herbrich@gmail.com">Email Address</a>
<a class="external" href="http://www.google.com">Homepage</a>
</div>'''
from lxml import etree
tree = etree.XML(content)
phone_number = tree.xpath('div[2]')[0].tail.strip()
print(phone_number)
<强>输出强>
'+487 (0)639 14485653'
strip()
函数用于删除tail
文本两侧的空格。
答案 1 :(得分:0)
您可以在div标签之后迭代并获取文本。
from lxml import etree
tree = etree.parse("filename.xml")
items = tree.xpath('//div')
for node in items:
# you can check here if it is a phone number
print node.tail