xpath

#找到虚构类和非虚构类的所有图书
all_book = lhtml.xpath('//div[@class="article" or @class="aside"]//li/div')
for book in all_book:
        #找到图书标题
      book_title = re.sub(r'[\n\t\s]+','',''.join(book.xpath('h2//text()')))  #使用正则去掉换行空格等字符
        #图书简介,其余字段类似
     detail =re.sub(r'[\n\t\s]+','',''.join(book.xpath('p[@class="detail"ornot(@class)]/text()')))  #因为还有一部分p标签是没有属性的,注意这里的or与not
        yield {book_title:detail}   #返回字典,也可以保存到文本或数据库你好!
       

第一种情况:以相同的字符开始的情况,提取以下三个内容难道要写三次?
解决方法:用starts-with(@属性名称,属性相同的部分)
举例:
<div id='test-1'>需要的内容1</div>
<div id='test-2'>需要的内容2</div>
<div id='test-fault'>需要的内容3</div>
方案:response.xpath("//div[starts-with(@id, 'test')]/text()")


第二种情况:标签套标签,下面的情况如何提取成一句完整的话?div套着的标签如何提取?
解决方法:string(.)
举例:
html = '''
<div id="class3">
    我左青龙,
    <span id='tiger'>
        右白虎,
        <ul>上朱雀,
            <li>下玄武.</li>
        </ul>
        老牛在当中,
    </span>
    龙头在胸口.
</div>
'''
# 方案:
from lxml import etree
selector = etree.HTML(html)
data = selector.xpath('//div[@id="class3"]')[0]
info = data.xpath('string(.)')#实际上是去除了div中间的其他多余标签
print(info)
content2=info.replace('\n','').replace(' ','')#将换行与空格分别取代
print(content2)

# 输出结果:我左青龙,右白虎,上朱雀,下玄武.老牛在当中,龙头在胸口.
通配符			表意
*					任意元素节点
@*				任意属性节点
node()			任意类型节点

如:

路径表达式				结果
/body/*						选取body元素的所有子元素。
//*								选取文档中的所有元素。
//div[@*]					选取带有任意属性的div


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值