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