如何在使用spider抓取数据之前检查xpath表达式(如果有效/不是)

时间:2014-12-09 13:20:26

标签: python-2.7 xpath scrapy truthiness

可能你已经通过标题实现了,我正在使用scrapy和xpath来提取数据。我尝试从文件到蜘蛛提供xpath(使蜘蛛通用 - 不经常编辑)根据需要,我能够以所需的格式提取数据。

此外,现在我想检查xpath表达式(相对于蜘蛛中指定的网页),如果提供的xpath有效(如果html样式已更改,那么我的xpath将无效)。关于这一点,我想在蜘蛛开始之前检查我的xpath表达式。

如何测试xpath的正确性?或者有没有办法进行真值测试?请帮忙。

class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = ["file:///<filepath>.html"]
def __init__(self):
    self.mt = ""
def parse(self, response):
    respDta = dict()
    it_lst = []
    dtData = response.selector.xpath(gx.spcPth[0])
    for ra in dtData:
        comoodityObj = ra.xpath(gx.spcPth[1])
        list = comoodityObj.extract()
        cmdNme = list[0].replace(u'\xa0', u' ')
        cmdNme = cmdNme.replace("Header text: ", '')
        self.populate_item(response, respDta, cmdNme, it_lst, list[0])
    respDta["mt"] = self.mt
    jsonString = json.dumps(respDta, default=lambda o: o.__dict__)
    return jsonString

gx.spcPth gx.spcPth来自其他为xpath提供的函数。并且它已在许多实例中用于其余代码中。我需要在整个代码中蜘蛛启动之前检查xpath表达式,无论在哪里实现

6 个答案:

答案 0 :(得分:0)

Scrapy shell是一个交互式shell,您可以非常快速地尝试调试您的抓取代码。

参考:http://doc.scrapy.org/en/latest/topics/shell.html

shell用于测试XPath或CSS表达式,看看它们是如何工作的,以及它们从你试图抓取的网页中提取的数据

答案 1 :(得分:0)

最好的办法是测试Scrapy如何使用你提供给蜘蛛的xpath只是使用Scrapy Shell

$ scrapy shell <url>

这将为您提供一个sel对象,您可以对其运行xpath:

>>> sel.xpath('//title/text()')

如果您想要一些非常快速的测试,请安装“XPath Helper”Chrome扩展程序。这是我最喜欢的扩展,可以非常快速地测试和确定xpath:

XPath Helper

您只需访问Chrome中的网站,按Ctrl + Shift + X,然后输入x路径即可。你会在右侧看到结果。

答案 2 :(得分:0)

我明白你要做什么,我只是不明白为什么。运行蜘蛛的整个过程同时也是你的测试&#34;进程 - 简单如下:如果xpath的结果为空并且它应该返回一些东西,那么就会出错。为什么不检查xpath结果并使用scrapy日志记录将其标记为警告,错误或严重,无论您想要什么。这很简单:

from scrapy import log

somedata = response.xpath(my_supper_dupper_xpath)
# we know that this should have captured
# something, so we check
if not somedata:
    log.msg("This should never happen, XPath's are all wrong, OMG!", level=log.CRITICAL)
else:
    # do your actual parsing of the captured data, 
    # that we now know exists  

在那之后,只需运行你的蜘蛛并放松一下。当您在输出日志中看到关键消息时,您将知道是时候搞砸砖块了。否则,一切都很好。

答案 3 :(得分:0)

shell是要走的路。 如果需要,你甚至可以在你的蜘蛛中调用它,如documentation中所述 我有时觉得这很有用。

答案 4 :(得分:0)

这是使用Selectors进行xpath验证的简单方法:

from scrapy.selector import Selector

try:
    my_xpath = '//div/some/xpath'
    Selector(text="").xpath(my_xpath)
    print("valid xpath")
except ValueError as e:
    print(e)

答案 5 :(得分:0)

您不仅应该确保您有 200 代码响应,还应该检查实际响应是什么:

view(response)

然后,正如 JoneLinux 所说,您需要使用

scrapy shell 'URL'

但不是sel.xpath()

你应该使用:

response.xpath('//YourXpath...')