使用lxml etree查找文本

时间:2015-12-29 14:35:31

标签: python html parsing lxml elementtree

我正在尝试使用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>之间提取文本

2 个答案:

答案 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