Python--lxml

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()

 

posted @ 2022-01-19 09:04  liDB  阅读(57)  评论(0编辑  收藏  举报