Как я могу решить эту конкретную ошибку: «TypeError: Тип« NoneType »не может быть сериализован».ошибка? - PullRequest
0 голосов
/ 23 июня 2019

Во-первых, краткое описание проблемы: в неупорядоченном списке у нас есть много элементов списка, каждый из которых соответствует «карточке»

<ul>
    <li>
        <p><span>can you slice columns in a 2d list? </span></p>
        <pre><code class='language-python' lang='python'>queryMatrixTranspose[a-1:b][i] = queryMatrix[i][a-1:b] 
  • Нет: не могу этого сделать, потому что python не поддерживает многоосевую нарезку, только многорезультатную нарезку; см. статью http://ilan.schnell -web.net / prog / slicing / для получения дополнительной информации.

Ответом на карточке всегда будет элемент списка, расположенный под xpath: /html/body/ul/li/ul. Я хотел бы получить ответ в формате, показанном здесь

    <li>
        <span>No: can&#39;t do this because python doesn&#39;t support multi-axis slicing, only multi-list slicing; see the article </span><a href='http://ilan.schnell-web.net/prog/slicing/' target='_blank' class='url'>http://ilan.schnell-web.net/prog/slicing/</a><span> for more info.</span> 
    </li>

Вопрос карточки - это все, что остается в xpath: /html/body/ul/li после того, как ответ извлечен:

    <li>
        <p><span>can you slice columns in a 2d list? </span></p>
        <pre><code class='language-python' lang='python'>queryMatrixTranspose[a-1:b][i] = queryMatrix[i][a-1:b] 

Для каждой карточки в неупорядоченном списке карточек я бы хотел извлечь кодированное utf-8 html-содержимое элементов списка вопросов и ответов. То есть я хотел бы иметь теги text и html.


Я пытался решить эту проблему, перебирая каждую карточку и соответствующий ответ и удаляя ответ дочернего узла из карточки родительского узла.

flashcard_list = []
htmlTree = html.fromstring(htmlString)    
for flashcardTree,answerTree in zip(htmlTree.xpath("/html/body/ul/li"),
 htmlTree.xpath('/html/body/ul/li/ul')):

    flashcard = html.tostring(flashcardTree, 
        pretty_print=True).decode("utf-8")

    answer = html.tostring(answerTree, 
        pretty_print=True).decode("utf-8")

    question = html.tostring(flashcardTree.remove(answerTree), 
        pretty_print=True).decode("utf-8")

    flashcard_list.append((question,answer))

Однако, когда я пытаюсь удалить ответ дочерний узел с flashcardTree.remove(answerTree), я сталкиваюсь с ошибкой, TypeError: Type 'NoneType' cannot be serialized. Я не понимаю, почему эта функция не вернет ничего; Я пытаюсь удалить узел на /html/body/ul/li/ul, который является допустимым дочерним узлом /html/body/ul/li.

Любые ваши предложения будут с благодарностью. Я никоим образом не привязан к коду, который написал в своей первой попытке; Я приму любой ответ, где вывод представляет собой список (вопрос, ответ) кортежей, по одному на каждую карточку.

1 Ответ

0 голосов
/ 24 июня 2019

Если я правильно понимаю, что вы ищете, это должно работать:

for flashcardTree,answerTree in zip(htmlTree.xpath("/html/body/ul/li/p/span"),
 htmlTree.xpath('/html/body/ul/li/ul/li/descendant-or-self::*')):

    question = flashcardTree.text
    answer = answerTree.text_content().strip()
    flashcard_list.append((question,answer))

for i in flashcard_list:
    print(i[0],'\n',i[1])

Выход:

Можете ли вы нарезать столбцы в 2d списке?
Нет: не могу этого сделать, потому что python не поддерживает многоосевую нарезку, только многорезервную нарезку; см. статью http://ilan.schnell -web.net / prog / slicing / для получения дополнительной информации.

...