注意 // 表示根节点
中间节点 寻找应该是 .// 标示当前节点下所有(//) ./h1 或者 h1 标示当前的直接子节点
a=selector("<div class='1'><a>a</a><a>b</a></div><div class='1'><a>aa</a><a>bb</a></div>");
以下是完全一样的结果
a.xpath(//div[@class="1"]/a/text()) //text取值文本 但是这里返回的依然是select列表 extract后才只显示文本
a.xpath(//div[@class="1"]//a/text())
text 表示取第一级文本 extract表示返回unicode字符串列表, extract_first(default="xx") 标示取返回列表中第一个值返回
获取title标签中的文本
hxs.select("//title/text()")
只显示文本,而不是一个XPathSelectorList
hxs.select("//title/text()").extract()
用scrapy shell来测试http://finance.ifeng.com/a/20140821/12969341_0.shtml,提取正文
http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/selectors.html?highlight=xpath
1. response.xpath('//div[@id="main_content"]/text()').extract()
提取到的不是空的,就是\n,\t之类的字符
text()是取此xpath内部第一级纯文本,所以只适合提取纯文本,不适合提取html
2.response.xpath('//div[@id="main_content"]').extract()
这次倒是可以提取到html内容了,但是开头包含<div id="main_content" ,结尾包含</div>
不太纯净
3.response.xpath('//div[@id="main_content"]/*').extract()
用这个可以提取到内部的所有html内容,是以列表的形式,要转换成字符串
用"".join(response.xpath('//div[@id="main_content"]/*').extract())就可以了
某些情况下response.xpath('//div[@id="main_content"]/*').extract()也取不到完整的内容
建议用
response.xpath('//div[@id="main_content"]/node()').extract()
参考
http://stackoverflow.com/questions/11463538/scrapy-html-xpath-selector-return-result-as-html
4.那怎么提取所有内部纯文本而不是html呢?
直接用"".join(response.xpath('//div[@id="main_content"]//text()').extract())
xpath中一个/只代表提取直接子节点,//可以提取所有子节点
参考
http://stackoverflow.com/questions/5390133/scrapy-body-text-only