python-3.x - 解析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> </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] 的数组
解决方案
您可以使用以下 xpath。
contact_name = tree.xpath("//div[@class='data-table-cell-3']/descendant::*[last()]/text()")
输出:
['联系人 1', '\xa0']
推荐阅读
- rest - 使用此处的 REST API 基于单个坐标获取速度限制
- bash - 为什么我会收到错误“eval:在意外标记 `then' 附近出现语法错误”?重击
- oracle - 提供者与 oracle 版本不兼容(ASP.NET Core MVC)
- phpstorm - PhpStorm 更改特定的重新格式化代码选项
- r - 当您的包包含具有非英文字符的函数时出现编码问题
- x86-64 - UEFI 是否需要在 x64 上映射 4k 页面?
- flutter - Flutter)我想在socket断开时自动重新连接
- java - 如何使用 PHP 在 android studio 中输入数据到 firebase
- php - Foreach - 确定每次迭代中是否存在键
- javascript - 如何将 Formik 连接到 Material UI 的无线电控制组?