#找到虚构类和非虚构类的所有图书
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
xpath
最新推荐文章于 2021-06-04 11:45:59 发布