zoukankan      html  css  js  c++  java
  • Pythonlxml

    lxml 一点常用的操作

    from lxml import etree
    
    
    def get_all_child_node_text():
        txt = """
        <div class="content" id='id_' name='name_'>
            <p>输入只有一行半径r.</p>
        </div>
        <div class="content">
            <p>输出有多行,每一行是跟输入对应面积.</p>
            <p>输出保留6位小数</p>
        </div>
        """
        html = etree.HTML(txt)
        contents = html.xpath('//div[@class="content"]')
        lst = []
        for e in contents:
            # 第一种方式,通过使用xpath的string()方法
            # string(.)中的.代表当前节点
            # lst.append(e.xpath('string(.)').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.\n        输出保留6位小数']
            # lst.append(e.xpath('string(.)'))
            # ['\n        输入只有一行半径r.\n    ', '\n        输出有多行,每一行是跟输入对应面积.\n        输出保留6位小数\n    ']
            # lst.append(e.xpath('string(.)').replace('\n', '').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.        输出保留6位小数']
    
            # 第二种方式使用lxml节点自带的方法itertext()
            # lst.append(''.join(e.itertext()))
            # ['\n        输入只有一行半径r.\n    ', '\n        输出有多行,每一行是跟输入对应面积.\n        输出保留6位小数\n    ']
            # lst.append(''.join(e.itertext()).replace('\n', '').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.        输出保留6位小数']
            lst.append(''.join([s.strip() for s in e.itertext()]).replace('\n', '').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.输出保留6位小数']
    
            # 第三种,通过使用xpath的text()  效果与itertext()类似,估计itertext()就是封装了这个
            # print('e.xpath text', e.xpath('./text()'))  # 只获取当前节点的直接文本,不包含子节点
            # print('e.xpath all text', e.xpath('.//text()'))  # 包含子节点文本 打印的是list
            # lst.append(''.join(e.xpath('.//text()')))
            # ['\n        输入只有一行半径r.\n    ', '\n        输出有多行,每一行是跟输入对应面积.\n        输出保留6位小数\n    ']
            # lst.append(''.join(e.xpath('.//text()')).replace('\n', '').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.        输出保留6位小数']
            # lst.append(''.join([s.strip() for s in e.xpath('.//text()')]).replace('\n', '').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.输出保留6位小数']
    
            # 第四种,使用etree.tostring(...)方法
            # print('etree.tostring', etree.tostring(e, method='text', encoding='unicode'))  # 打印的是字符串
            # lst.append(etree.tostring(e, method='text', encoding='unicode'))
            # ['\n        输入只有一行半径r.\n    \n    ', '\n        输出有多行,每一行是跟输入对应面积.\n        输出保留6位小数\n    \n    ']
            # lst.append(etree.tostring(e, method='text', encoding='unicode').replace('\n', '').strip())
            # ['输入只有一行半径r.', '输出有多行,每一行是跟输入对应面积.        输出保留6位小数']
    
        # 感觉用第二种简洁一点,效果与第三种类似
        print(lst)
    
    
    def key_operator():
        html = etree.HTML('html文本')
        element_list = html.xpath('xpath')
        element_list = html.cssselect('css选择器')
        element = element_list[0]
        etree.tostring(element, encoding='utf-8')  # 字符编码控制
        print(element.tag)  # 标签名称
        print(element.text)  # 文本
        print(element.tail)  # 文本
        print(element.attrib)  # 属性 类似字典结构
        print(element.get('属性名称'))  # 也可用直接通过get方法获取属性值
    
    
    if __name__ == '__main__':
        get_all_child_node_text()
  • 相关阅读:
    你眼中的程序员 VS 程序员眼中的自己,是时候打破代沟了
    GaussDB(for openGauss)让数据“存得下、算得快、算得准”
    初识GaussDB(for Cassandra)
    云原生势不可挡,华为云GaussDB加速企业数字化转型
    HDC.Cloud2021|开发者们都在谈的云原生到底长什么样?
    基于深度神经网络的噪声标签学习
    华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致
    Delphi 窗体函数GetActiveWindow
    Delphi 窗体函数GetWindowText -获取窗口的标题
    深度学习数据预处理
  • 原文地址:https://www.cnblogs.com/yarightok/p/15820864.html
Copyright © 2011-2022 走看看