xpath教程 3 - xpath的小结
一、xpath提取内容
1、提取节点中最表层的文本
htmlobj.xpath("./text()")
在scrapy中用extract()[0]方法抽取文本。如:
temp['title'] = node.xpath('./text()').extract()[0].strip()
temp['title_url'] = node.xpath('./@href').extract()[0]
python中用到extract一般会是scrapy中获取meta内容。
2、提取节点中多嵌套的文本
htmlobj.xpath("string(.)").strip()
from lxml import etree # 获取全部有意义正文文本 html_str="""<div>hah<a>六六六</a>cccc收拾收拾</div>""" html_etree = etree.HTML(html_str) # 获取element 类型的html all_content = html_etree.xpath('string(.)').strip() print(all_content)
技巧:如果要剔除string(.)文本中的所有空格和换行,可以通过python的replace方法:
if all_content: # 消除文本中的所有空格和换行 all_content = all_content.replace(' ', '').replace('\n', '')
遇到gbk编码问题解决方案:
print(all_content.encode('gbk', 'ignore').decode('gbk'))
原文:https://www.jb51.net/article/143722.htm
输出:
hah六六六cccc收拾收拾
3、提取节点中属性的值
htmlobj.xpath("./@href")
<div class="item item-btn">
<input type="hidden" name="type" value="ML" />
</div>
html_str = response.content.decode() html_etree = etree.HTML(html_str) # 获取element 类型的html all_content = html_etree.xpath("//div[@class='item item-btn']//input[@name='type']/@value") print(all_content)
输出:
['PL', 'ML']
二、xpath谓语的其他使用
xpath定位中starts-with、contains和text()的用法
1、starts-with
顾名思义,匹配一个属性开始位置的关键字
//input[starts-with(@name,'name1')] 查找name属性中开始位置包含'name1'关键字的页面元素
2、contains
匹配一个属性值中包含的字符串
//input[contains(@name,'na')] 查找name属性中包含na关键字的页面元素
排除元素
https://www.jianshu.com/p/2b525a238371
//input[contains(@name,'am') and not(contains(@title,'pm'))] 查找name属性中包含am关键字的页面元素,并且排除title属性中包含pm的元素。
//li[(contains(@class,'tree') and contains(@class,'show')) or (contains(@class,'tree tree'))]
3、text()
匹配的是显示文本信息,此处也可以用来做定位用
<a href="http://www.baidu.com">百度搜索</a>
xpath写法为 //a[text()='百度搜索']
或者 //a[contains(text(),"百度搜索")]
参考:
http://blog.csdn.net/zhouxuan623/article/details/43935039
3、注意
如果有tbody标签,要省去tbody及之前的路径,写成相对路径