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及之前的路径,写成相对路径

 

posted @ 2018-12-19 17:48  安迪9468  阅读(397)  评论(0编辑  收藏  举报