python - 使用 Python Lxml 解析静态 html 文件中的隐藏元素
问题描述
我有一组静态 Html 文件,我需要从中解析和获取一些详细信息。我正在使用 Python - lxml 模块来获取所需的详细信息。来自静态 html 文件的示例如下所示:
<div class="top">
<a data-bind="text">abc</a>
<span data-bind="visible:hotel.marca1!='' && hotel.marca1!='logo_ha', attr:{title:hotel.textoMarca1}" title="Hotusa" style="display: none;">
</span>
<span class="marca" data-bind="visible:hotel.marca1==='' || hotel.marca1==='logo_ha'">
</span>
<span class="star sprite-disponibilidad star1" data-bind="visible:hotel.cat === '1'" style="display: none;"></span>
<span class="star sprite-disponibilidad star2" data-bind="visible:hotel.cat === '2'" style="display: none;"></span>
<span class="star sprite-disponibilidad star3" data-bind="visible:hotel.cat === '3'" style="display: none;"></span>
<span class="star sprite-disponibilidad star4" data-bind="visible:hotel.cat === '4'"></span>
<span class="star sprite-disponibilidad star5" data-bind="visible:hotel.cat === '5'" style="display: none;"></span>
<div class="adr">
<span></span>
<span class="locality" data-bind="text: hotel.pob"></span>
</div>
</div>
<div class="top">
<a data-bind="text">dfg</a>
<span data-bind="visible:hotel.marca1!='' && hotel.marca1!='logo_ha', attr:{title:hotel.textoMarca1}" title="Hotusa" style="display: none;">
</span>
<span class="marca" data-bind="visible:hotel.marca1==='' || hotel.marca1==='logo_ha'">
</span>
<span class="star sprite-disponibilidad star1" data-bind="visible:hotel.cat === '1'" style="display: none;"></span>
<span class="star sprite-disponibilidad star2" data-bind="visible:hotel.cat === '2'" style="display: none;"></span>
<span class="star sprite-disponibilidad star3" data-bind="visible:hotel.cat === '3'" style="display: none;"></span>
<span class="star sprite-disponibilidad star4" data-bind="visible:hotel.cat === '4'" style="display: none;"></span>
<span class="star sprite-disponibilidad star5" data-bind="visible:hotel.cat === '5'" style="display: none;"></span>
<div class="adr">
<span></span>
<span class="locality" data-bind="text: hotel.pob"></span>
</div>
所以这是我需要从可见的 span class = 'star' 元素中获得星级的问题;例如,在第一个 div[@top] 中,可见的 span 的星级为“4”,而第二个 div[@top] 没有可见的 span[class=star] 元素,因此它应该返回一个星级'0'。但是,由于这些元素是隐藏的,因此我无法获取 em 并让脚本在所有 span[@class=star] 'hidden' 的 div 元素上返回 '0' 星级评分。
这是我到目前为止所尝试的:
tree = html.fromstring(page)
for sali in tree.xpath('//div[@class="top"]'):
for x in sali.xpath('a'):
for sal in sali.xpath('span[not(contains(@style,"display:none"))]'):
print x , sal.attrib['data-bind']
但是这段代码对我想要的结果没有帮助,我在做什么错误?
预期输出:abc 4 dfg 0
解决方案
有几种方法可以解决这个问题,这里有一种解决方法:获取“星级”评级元素,如果没有找到,则返回第一个“可见”元素的索引下降到 0。我们可以使用next()
并enumerate()
实现:
def is_visible(element):
"""Naive implementation of the element visibility check."""
return 'display: none;' not in element.attrib.get("style", "")
def get_rating(entry):
rating_elements = entry.xpath(".//span[contains(@class, 'star')]")
visibile_rating = (index
for index, element in enumerate(rating_elements, start=1)
if is_visible(element))
return next(visibile_rating, 0)
root = fromstring(html)
for sali in root.xpath('//div[@class="top"]'):
for x in sali.xpath('a'):
print(x.text, get_rating(sali))
印刷:
('abc', 4)
('dfg', 0)
请注意,class
属性是一个多值属性,严格来说,contains()
它不是通过类值查找元素的最佳工具:
推荐阅读
- python-3.x - 在方法/函数中运行 chromedriver 时,Chrome 浏览器会自动关闭
- javascript - 流类型:函数的返回类型与回调的参数相同?
- python - 如何确定字典中的数字是str还是float?
- java - 无法使用 Retrofit 在 ListView 中显示数据
- vue.js - Vue-router 附加相同的 URL
- drupal - Drupal 7 settings.php 中的 $conf['file_temporary_path'] 没有做任何事情,为什么?
- ruby-on-rails - 表单输入要求字段不为空
- javascript - 在 react-native 中找不到变量
- eclipse-plugin - STS 是否支持 spring 集成插件来查看集成流程?
- javascript - 如何正确检索 JQuery 中的值?