Во-первых, краткое описание проблемы: в неупорядоченном списке у нас есть много элементов списка, каждый из которых соответствует «карточке»
<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]
Ответом на карточке всегда будет элемент списка, расположенный под xpath: /html/body/ul/li/ul
. Я хотел бы получить ответ в формате, показанном здесь
<li>
<span>No: can't do this because python doesn'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
.
Любые ваши предложения будут с благодарностью. Я никоим образом не привязан к коду, который написал в своей первой попытке; Я приму любой ответ, где вывод представляет собой список (вопрос, ответ) кортежей, по одному на каждую карточку.