废弃代码返回没有结果

时间:2014-08-06 08:29:32

标签: web-scraping scrapy web-crawler scrapy-spider

我是网络抓取的新手,并试图废弃示例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中犯了什么错误?

谢谢!

2 个答案:

答案 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()

希望这两种方法中的一种完全符合您的查询:)