解决:xpath取出指定多标签内所有文字text

Python 2.7
Pycharm 5.0.3


问题

再写一个markdown自动引用的小脚本的时候新出现的问题,也就是利用xpath取出字符串的问题,记录一下


取出如下字符串

这里写图片描述

我要取出mrlevo520的内容,怎么取呢,很多方法,bs4也可以,正则也可以,动态selenium也可以,这次我想尝试用xpath来做,一则是为了和selenium接轨,xpath的确很强大,二来是firefox提供firebug插件,可以直接定位你需要内容的标签,一步到位简直完美,不多说,上程序。

import urllib2
from lxml import etree
crawl_url = "http://www.jianshu.com/p/e2c4ebd2eeb3"
req = urllib2.Request(crawl_url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
response = urllib2.urlopen(req)
html = response.read()
selector = etree.HTML(html)
# 核心部分
bloger = selector.xpath("//a[@class='author-name blue-link']")
info = bloger[0].xpath('string(.)').encode('utf-8').strip()


print info #打印出mrlevo

网上的方法

这里写图片描述

ok,我们来试下,用小哥改进的方法取出上面那个标签

# 修改-核心部分,其余保持一样
bloger = selector.xpath("//a[@class='author-name blue-link']")
print bloger[0].xpath('string(.)').extract()[0]

ok,又报错

AttributeError: '_ElementStringResult' object has no attribute 'extract'

查看类型,如小哥所说,的确是list,再查看列表

print type(bloger) # list
print type(bloger[0]) #'lxml.etree._Element'
print (bloger[0]) # <Element a at 0x36e9208>
# ok,这要取出bloger[0]里面的字符串就可以了

再次修改代码,去掉extract(),并去掉周围空格

# 核心部分
bloger = selector.xpath("//a[@class='author-name blue-link']")
print bloger[0].xpath('string(.)').strip()
# ok,取值成功

对于小哥的例子,取出来之后字符串片段使用连接字符串(join)就可以了(可能都不需要join,我没试过)


总结

查阅多很博客,大家抄的抄,也不去做验证,我相信简书小哥是验证过的,其余的,,,额,但是简书小哥@向右奔跑貌似对我的例子并不成立,我也母鸡了,还是自己调试,所以,希望我们能帮到你,这些方法你都可以试试。


BTW

如果对于单标签定位足够精确了,那么取出文本还可以用text的方法我们来看一下;

这里写图片描述

采用text的方法

import urllib2
from lxml import etree
crawl_url = "http://blog.chinaunix.net/uid-28266791-id-5754271.html"
req = urllib2.Request(crawl_url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
response = urllib2.urlopen(req)
html = response.read()
selector = etree.HTML(html)
# 核心部分
bloger = selector.xpath("//div[@class='Blog_left']/div/div/p/a")[0].text.encode('utf-8').strip()

print bloger #打印出夏寥寥

我们一般认为text的方法能够取出一个标签下的所有文本,其实不然,即使那个文本在其标签下(次级标签)想要定位范围稍微放宽,text的方法就不再适用,也就是说,我想要取出一个一级标签下的所有内容,如果有二级标签,三级标签,那么想要一下子把所有内容都取出来,只能靠string(.)的方法了

致谢

@青南–xpath提取多个标签下的text
@向右奔跑–XPath提取多个标签下的text

  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值