Scrapy中<br>标签为何会导致XPath的text()方法失效?
嘿,这个问题我之前也碰到过!原因很简单——你的代码用extract_first()只拿到了<p>标签里的第一个文本节点,因为<br>标签把<p>内的内容分割成了两个独立的文本片段,extract_first()只会取第一个(也就是"Hello,")。
给你几个靠谱的解决办法,按需选就行:
方法1:获取所有文本节点后拼接
用getall()(Scrapy 1.5+推荐的方法,替代旧的extract())获取<p>下所有的文本节点,再把它们拼接成完整内容:
item['post'] = ' '.join(response.xpath('.//div[@class="post-content"]//p//text()').getall()).strip()
这里//text()会抓取<p>里所有层级的文本内容,包括<br>前后的部分,join用来把零散的文本串起来,strip()可以去掉首尾多余的空格。
方法2:用XPath的string()方法直接提取完整文本
XPath的string()方法可以直接提取指定节点及其子节点的所有文本,自动合并成一个字符串:
item['post'] = response.xpath('string(.//div[@class="post-content"]//p)').get().encode('utf-8')
这个方法更简洁,不过要注意它会保留原有的换行,如果你需要统一格式的话,可以再做下换行替换。
方法3:保留原排版(替换<br>为换行)
如果想保留原页面的换行格式,可以先把<br>标签替换成换行符,再提取文本:
from w3lib.html import replace_entities, replace_tags # 先获取<p>标签的HTML内容 content_html = response.xpath('.//div[@class="post-content"]//p').get() # 把<br>替换成换行,其他标签去掉 cleaned_content = replace_tags(content_html, replace_with='\n') # 替换HTML实体,清理首尾空格后编码 item['post'] = replace_entities(cleaned_content).strip().encode('utf-8')
这种方法能最大程度还原原帖子的排版样式。
另外提一句,现在Scrapy官方更推荐用get()和getall(),比extract_first()和extract()的语义更清晰哦!
内容的提问来源于stack exchange,提问作者user7304253
相关产品推荐
相关产品推荐

