从用户给定的项中自动检测Xpath作为inpu

2024-04-26 14:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个烧瓶应用程序,运行刮泥蜘蛛爬行给定的网站。Flask应用程序提供了一个UI,它接受要废弃的URL和要废弃的项(比如website的职称)。在

现在,问题是,spider如何自动检测用户给定项的Xpath????在

以下是spider的代码(使用硬编码的Xpath):

class StackItem(scrapy.Item):
    def __setitem__(self, key, value):
        if key not in self.fields:
            self.fields[key] = scrapy.Field()
        self._values[key] = value


class newAppSpider(CrawlSpider):
    name = "appSpider"


    def __init__(self, *args, **kwargs): 
        super(newAppSpider, self).__init__(*args, **kwargs) 
        self.start_urls = [kwargs.get('start_url')]

    rules = (Rule (SgmlLinkExtractor(allow=('.*\?id1=.*',),restrict_xpaths=('//a[@class="prevNext next"]',))
, callback="parse_items", follow= True),)


    def parse_items(self, response):
        hxs = HtmlXPathSelector(response)
        posts = hxs.select("//article[@class='classified']")
        items = []

        for post in posts:
            item = StackItem()
            item[self.settings['MY_PROPERTY']] = post.select("div[@class='uu mb2px']/a/strong/text()").extract() 
            items.append(item)

            for item in items:
                yield item

Tags: keyinself应用程序fieldsvaluedefitems
1条回答
网友
1楼 · 发布于 2024-04-26 14:33:19

因为你要在一个节点集中找到一个文本(每个职位公告),你必须迭代你发布的节点,看看这个节点是否包含你需要的文本。在

如果您想让XPath非常通用,这是一个很大的问题。在

但是,如果特定的帖子包含此文本,则可以使用以下内容:

for post in posts:
    text_node = self.find_text(post, "Job Title")
        if text_node:
            print text_node.xpath('text()').extract()

以及进入spider的find_text函数(这可以进一步改进):

^{pr2}$

注意XPath的contains区分大小写。这意味着职务不等于职务。在

但是,如果你看一下这个网站,你会发现“职务”会带来一个小问题,因为这个标签不仅仅包含了职位名称。在

还有一件事

因为您使用了规则,start_url不会被解析。这是显而易见的,如果你输入“职位”作为搜索文本,它会找到更深的职位描述与此文本在其中。要解决此问题,必须重写spider的parse_start_url函数:

^{3}$

对于启动错误

在您从烧瓶网站获得的价值周围加上引号:

command = "scrapy crawl appSpider -a start_url=" + request.form['url'] + '-s MY_PROPERTY="' + request.form['tag1']+'"'

相关问题 更多 >