Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
385 views
in Technique[技术] by (71.8m points)

使用scrapy时xpath解析的两个语法问题

xpath解析语句是这样的:

item['title'] = response.xpath('//span[@class="title"]/text()').extract_first()
item['content'] = response.xpath('//div[@class="content"]').extract_first()

解析结果是这样的:

{
'title': '你好',
'content': '<div class="content">哎哟不错哟<br>
哈哈哈哈</div>'
}

问题:
1、解析结果的title字段中有个,网页中显示为空格,怎么去掉它,好像是用re_first(),但不知括号里面正则表达式应该怎么写。
2、解析结果的content字段是一段有格式的文本,需要保留格式,但不需要包含节点<div class="content"></div>自身,只需要它的子节点的所有内容,xpath语句应该怎么写?
请大神帮写一下,谢谢。

更新:
如果content的html是这样的:

<div class="content">
<p>能够在过去这么多年的时间里研究并学习宇宙学,对我来说意义非凡。</p>
<p>我很开心也很荣幸可以为人们对于黑洞和宇宙的形成的认识做出贡献。</p>
</div>

xpath解析语句:

item['content'] = response.xpath('//div[@class="content"]').extract_first()

解析结果:

{
    'content': '<div class="content"><p>能够在过去这么多年的时间里研究并学习宇宙学,对我来说意义非凡。</p><p>我很开心也很荣幸可以为人们对于黑洞和宇宙的形成的认识做出贡献。</p></div>'
}

问题:
不需要外面的<div class="content"></div>,里面的p标签保留,需要怎么写?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

对于你第二次提出的问题:

sel.xpath("//div[@class='content']//p").extract()

不过,俗话说得好:

授人以鱼,不如授人以鱽鱾鲀鱿鲃鲂鲉鲌鲄鲆鲅鲇鲏鲊鲋鲐鲈鲍鲎鲝鲘鲙鲗鲓鲖鲞鲛鲒鲚鲜鲟鲔鲕鲑鲧鲬鲪鲫鲩鲣鲨鲡鲢鲤鲠鲥鲦鲺鲯鲹鲴鲶鲳鲮鲭鲵鲲鲰鲱鲻鲷鲸鳋鳊鳁鳀鲾鲼鳈鳉鳃鳄鲿鳇鳂鳆鳅鲽鳌鳒鳎鳏鳑鳐鳍鳘。

所以,我想你需要的是重新学习理解一下XPath,链接拿好:
菜鸟教程XPath
我自己的XPath笔记

=============================更新的分割线===============================

content:


result = sel.xpath("//div[@class='content']/text()|//div[@class='content']/*").extract()
# 取两个XPath定位到的元素的并集

可以得到:

['哎哟不错哟', '<br>', '
哈哈哈哈']

然后可以手动拼接: "".join(result)
最后可以得到带格式的文本:

哎哟不错哟<br>
哈哈哈哈

title:

item["title"].strip()
# 去除空字符

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...