我是网络抓取的新手,并试图废弃示例forum。我在scrapy中使用以下代码: items.py文件
from scrapy.item import Item, Field
class StackoverflowItem(Item):
title = Field()
pass
和test.py
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class MySpider(BaseSpider):
name = "stackspider"
allowed_domains = ["http://www.toytowngermany.com"]
start_urls = ["http://www.toytowngermany.com/forum/index.php?showtopic=249843"]
def parse(self,response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//div[contains(@class, "post_block hentry with_rep")] /div[@class="post_wrap"]')
for sites in sites:
title = sites.select('div[@class="post_body"]/div[@class="post entry-content"]/text()').extract()
print title
这只是一个示例代码,我想废弃“post_block hentry with_rep”类下的所有信息。为了测试,我尝试运行上面的代码,但它没有给出任何结果。你能否告诉我在xpath中犯了什么错误?
谢谢!
答案 0 :(得分:1)
我认为主要的问题是post_body
div不是post_block
孩子的直接孩子 - 中间还有另一个div。
尝试这样的事情:
class MySpider(Spider):
name = "stackspider"
allowed_domains = ["http://www.toytowngermany.com"]
start_urls = ["http://www.toytowngermany.com/forum/index.php?showtopic=249843"]
def parse(self, response):
sites = response.xpath('//div[contains(@class, "post_block hentry with_rep")]/div[@class="post_wrap"]')
for site in sites:
title = site.xpath('div/div[@class="post_body"]/div[@class="post entry-content"]/text()').extract()
print(title)
即。只需在第二个路径选择器的开头添加一个额外的div/
。或者,您可以添加.//
,这将允许在遇到post_body
之前层次结构中的任意元素。
答案 1 :(得分:1)
这是因为当您选择使用hx时,最后错过了"/"
,因为div层次结构将被中断:
sites = hxs.select('//div[contains(@class, "post_block hentry with_rep")] /div[@class="post_wrap"]/')
或第二个选项包括在您选择
的开头 title = sites.select('//div[@class="post_body"]/div[@class="post entry-content"]/text()').extract()
希望这两种方法中的一种完全符合您的查询:)