在Scrapy中选择具有非ASCII字符的节点

时间:2013-10-07 15:04:43

标签: python-2.7 xpath character-encoding web-scraping scrapy

我在Scrapy中编写了以下简单的Web抓取工具:

#!/usr/bin/env python
# -*- coding: latin-1 -*-

from scrapy.http import Request
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

class MySpiderTest(BaseSpider):
    name = 'MySpiderTest'
    allowed_domains = ["boliga.dk"]
    start_urls = ["http://www.boliga.dk/bbrinfo/3B71489C-AEA0-44CA-A0B2-7BD909B35618",]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        item = bbrItem()
        print hxs.select("id('unitControl')/div[2]/table/tbody/tr[td//text()[contains(.,'Antal Badeværelser')]]/td[2]/text()").extract()

但是当我运行蜘蛛时,我得到以下语法错误:

SyntaxError: Non-ASCII character '\xe6' in file... on line 32, but no encoding declared

因为æ中的xpath。 xpath适用于Xpath Checker Firefox。我尝试对æ进行网址编码,但这不起作用。我错过了什么?

谢谢!

UPDATE:我在代码的开头添加了编码声明(Latin-1应该支持丹麦语字符)

3 个答案:

答案 0 :(得分:5)

为XPath表达式使用unicode字符串

hxs.select(u"id('unitControl')/div[2]/table/tbody/tr[td//text()[contains(.,'Antal Badeværelser')]]/td[2]/text()").extract()

hxs.select(u"id('unitControl')/div[2]/table/tbody/tr[td//text()[contains(.,'Antal Badev\u00e6relser')]]/td[2]/text()").extract()

请参阅Unicode Literals in Python Source Code

答案 1 :(得分:0)

SyntaxError: Non-ASCII character ‘\xe2′ in file … on line 40, 

但未声明解码...

这是由替换标准字符(如撇号(')引起的,非标准字符,例如引用标记(`) 。

尝试编辑从pdf复制的文本。

答案 2 :(得分:0)

repsonse.xpath("//tr[contains(., '" + u'中文字符' + "')]").extract()