0

HTMLドキュメントでコンテンツを取得しようとしています。一部のドキュメントには、削除したいコンテンツがドキュメント内のどこにあるかを非常にうまく示す目次があります。それは、タグの値または text_content のいずれかであり、簡単に識別でき、必要なものを指しています。たとえば、次の値を持つ 2 つのアンカー タグが toc にあるとします。

key=href value=#listofplaces text_content=Places we have visited
key=href value=#transport text_content=Ways we have traveled

そして、ドキュメントの本文で

key=name value=listofplaces text_content=''

次に、多数の html 要素、いくつかのテーブル、おそらくいくつかの div タグ、次のアンカーが続く不明な数の要素があります

key=name value=transport text_content=''

関数からの出力を使用して、ドキュメントからコピーするセクションの開始と終了を特定することを計画していました。つまり、ドキュメントを読んで、アンカー タグ listofplaces と transport の間のセクションを切り取りました。LXML は非常に強力なため、必要なコンテンツは何らかのブランチであり、その正体を把握できていないのではないかと考えるようになりました。

4

1 に答える 1

1

いいえ、兄弟間に単一のブランチはありません。ただし、親を反復して抽出することはできます (アンカー タグのハンドルが既にどのようにあるかに応じて、さまざまな方法で実行できます)。データが失われないように、テキストと末尾の処理に注意してください。example_docを変更して結果を確認すると、このサンプル コードをよりよく理解できる場合があります。

import lxml.etree

example_doc = """
  <root>
    <a name="listofplaces"/>
    text
    <sibling/>
    <sibling/>
    <a name="transport"/>
  </root>
"""
root = lxml.etree.XML(example_doc)

new_root = lxml.etree.Element("root")
it = iter(root)
for e in it:
  if e.tag == "a" and e.get("name") == "listofplaces":
    new_root.text = e.tail
    break
else:
  assert False, "TODO: handle tag not found"
for e in it:
  if e.tag == "a" and e.get("name") == "transport":
    break
  new_root.append(e)
else:
  assert False, "TODO: handle tag not found"

print lxml.etree.tostring(new_root)
于 2010-03-07T17:40:36.627 に答える