使用Python Lxml解析静态html文件中的隐藏元素

基数

我有一组静态Html文件,我需要解析它们并从中获取一些细节。我正在使用Python-lxml模块来获取所需的细节。静态html文件中的示例如下所示:

<div class="top">
<a data-bind="text">abc</a>
<span data-bind="visible:hotel.marca1!='' &amp;&amp; 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!='' &amp;&amp; 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]中,可见范围的星级为“ 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

ec

有几种方法可以解决该问题,这是解决该问题的一种方法:获取“星级”评级元素,并返回第一个“可见”元素的索引(如果找不到则降为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()它不是作业通过类值查找元素的最佳工具:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章