首页 > 解决方案 > 解析html文件时需要Xpath返回一个空列表项

问题描述

我正在使用 xpath 来解析一个包含大约 761 个项目的表。该表有大约 10 个属性。最后,我想创建一个 CSV 文件,以便将表格加载到 excel 中。

我能够加载本地 HTML 文件:

with open('test.html','r') as f:
    page = f.read()
tree = html.fromstring(page)

该表是使用 div 构建的。这是两个记录的示例:

<div ...>
   <a href = '.../office/profile'>Office 1</a>
</div>
<div ...>
   <a href = '.../office/profile'>Office 2</a>
</div>
<div class='data-table-cell-3'>
   <span><span>Contact 1</span></span>
</div>
<div class='data-table-cell-3'>
  <p>&nbsp;</p>
</div>

我可以用这个解析 Office 1 和 Office 2:

office = tree.xpath("//a[contains(@href, '/office/profile')]/text()")

我得到一个包含两个元素的列表!

当我用这个来解析联系人时:

contact_name = tree.xpath("//div[contains(@class, 'data-table-cell-3')]/span/span/text()")

我得到一个 [Contact 1] 而不是 ['Contact 1', ''] 的列表。注意这里的 HTML 结构发生了一些变化并去掉了跨度。

我读过这篇文章:如果没有找到数据,如何让 XPath 在 Python 中返回“无”?

并尝试按如下方式实现它:

contact_name = [x.text for x in tree.xpath("//div[contains(@class, 'data-table-cell-3')]/span/span/text()")]

并作为:

contact_name = [x.text for x in tree.xpath("//div[contains(@class, 'data-table-cell-3')]/span/span")]

并且都没有返回带有 ['Contact 1', none] 的数组

标签: python-3.xparsingxpath

解决方案


您可以使用以下 xpath。

 contact_name = tree.xpath("//div[@class='data-table-cell-3']/descendant::*[last()]/text()")

输出:

['联系人 1', '\xa0']


推荐阅读