python – Scrapy can't select a form using xpath


Hello, I'm using scrapy to make a crawler to get questions from competitions and etc. from the website, I can get the description of the question the correct alternative, but I can't get the alternatives whenever I run the return in the terminal of the alternatives and null, I don't know how to proceed could they help me?

        # -*- coding: utf-8 -*-
        import scrapy
        import re
        from enemGrabData.items import EnemgrabdataItem
        class MultipleSpider(scrapy.Spider):
            name = 'multiple'
            allowed_domains = ['']
            start_urls = ['']
            # html body div#content
            def parse(self, response):

                conteudo = response.xpath('//*[@id="content_questoes_conteudo"]')
                item = EnemgrabdataItem();
                for questao in conteudo.xpath('ul'):
                    item['pergunta'] = questao.xpath('li[4]/text()').extract()
                    item['alternativa_A'] = questao.xpath('form/li/fieldset').extract()
                    # //*[@id="content_questoes_conteudo"]/ul[10]/form/li/fieldset
                    item['alternativa_B'] = questao.xpath('/form/li/fieldset/label[2]/text()').extract()
                    item['alternativa_C'] = questao.xpath('/form/li/fieldset/label[3]/text()').extract()
                    item['alternativa_D'] = questao.xpath('/form/li/fieldset/label[4]/text()').extract()
                    item['alternativa_E'] = questao.xpath('/form/li/fieldset/label[5]/text()').extract()
                    item['alternativaCorreta'] = questao.xpath('//form/button/@onclick').extract()
                    inputString = str(item['alternativaCorreta']).split("checaquestao",1)[1]
                    item['alternativaCorreta'] = str(inputString).split(',')[1]

                    # re.findall(r"\(u'(.*?)',\)", inputString)[0]
                       yield item

            <li class="numero"><h3>Questão 5104. &nbsp; <a href="questoes-de-concursos/disciplina/1-portugues">Português</a> - Nível Superior - Polícia Militar GO - UEG - 2013</h3></li>

                <li><a style="cursor:pointer; margin-top:10px; display:inline-block;" onclick="onoff('teste5104')"><img src="imagem/texto-questao.gif" alt="Texto anexado à questão" width="10" height="10"> Texto anexado à questão</a></li>
                <li class="texto" style="display:none;margin-top:5px;" id="teste5104"> <img width="680" height="754" alt="Violência no Brasil, outro olhar" src=""></li>

            <li class="pergunta">A expressão “tais como” (linha 3) tem, no texto, a função de introduzir uma
            <form name="form-questoes"> 

                <li class="questao">
                    <span><input id="a5104" type="radio" name="radio5104" value="a"></span><label for="a5104">a) concessão</label>
                    <span><input id="b5104" type="radio" name="radio5104" value="b"></span><label for="b5104">b) exemplificação</label>
                    <span><input id="c5104" type="radio" name="radio5104" value="c"></span><label for="c5104">c) conclusão</label>
                    <span><input id="d5104" type="radio" name="radio5104" value="d"></span><label for="d5104">d) exceção</label>        

                <button title="Gabarito com resposta certa." name="botao5104" class="btn" type="button" onclick="checaquestao(5104,'b','mult-escolha')">Resolver questão</button>   

            <span id="msg5104"></span>  
            <li class="comentario">
        <li><a title="Explique esta questão!" href="javascript:abre_janela('',500,600)">Comentar questão</a></li>   
        <li><a title="Comentários sobre a questão!" href="javascript:abre_janela('',500,600)">0 comentários</a></li>
        <li><a title="Gabarito errado, está desatualizada, foi anulada pela banca, problemas na formatação, etc..." href="javascript:abre_janela('',500,600)">Notificar erro</a></li>



I think this example will be helpful for you. I haven't covered every possible case. There are issues of right and wrong that I haven't tested. But since your problem was picking up the alternatives, this example should give you a good idea of ​​how to proceed. The identification of the last page is based on the non-existence of the 'Last' button. It's kind of a weak check but it serves as an example.

# -*- coding: utf-8 -*-
from lxml import html

def parse(tree):
    conteudo = tree.xpath('//*[@id="content_questoes_conteudo"]')[0]
    forms = conteudo.xpath('form')
    for idx, questao in enumerate(conteudo.xpath('ul')):
        item = {}
        if len(questao.xpath('li[@class="numero"]')):
            item['questao'] = questao.xpath('li[@class="numero"]')[0].text_content()

        if len(questao.xpath('li[@class="texto"]')):
            item['texto'] = questao.xpath('li[@class="texto"]')[0].text_content()

        if len(questao.xpath('li[@class="pergunta"]')):
            item['pergunta'] = questao.xpath('li[@class="pergunta"]')[0].text_content()

        alternativas = forms[idx].xpath('li/fieldset/label')

        item['alternativa_A'] = alternativas[0].text if len(alternativas) > 0 else ''
        item['alternativa_B'] = alternativas[1].text if len(alternativas) > 1 else ''
        item['alternativa_C'] = alternativas[2].text if len(alternativas) > 2 else ''
        item['alternativa_D'] = alternativas[3].text if len(alternativas) > 3 else ''
        item['alternativa_E'] = alternativas[4].text if len(alternativas) > 4 else ''

        item['alternativaCorreta'] = forms[idx].xpath('button/@onclick')[0]
        inputString = str(item['alternativaCorreta']).split("checaquestao", 1)[1]
        item['alternativaCorreta'] = str(inputString).split(',')[1]

        yield item

template_url = "{}&id_categoria=&nivel=&orgao=&assunto=&pagina={}"

possui_mais_paginas = True
pagina_atual = 1
id_materia = 1  # portugues

while possui_mais_paginas:
    possui_mais_paginas = False  # chuta que é a ultima pagina

    tree = html.parse(template_url.format(id_materia, pagina_atual))

    for item in parse(tree):

    encontrou_botao_ultima = False
    for link in tree.xpath('//*[@id="content_paginacao"]/a'):
        if 'Última' in link.text:
            possui_mais_paginas = True  # se não é a ultima página vai para a proxima
            pagina_atual += 1
Scroll to Top