よう
構造を助けてください。
from lxml import etree
あなたのXMLサンプルは、よく形成されていない、私はこのようにそれを固定:あなたがetree.parse()
を使用することができ、ファイルを解析するには
content = """\
<urlset xmlns="http://www.crawlingcourse.com/sitemap/1.3">
<url>
<loc>
http://www.crawlingcourse.com/item-3911512
</loc>
</url>
</urlset>"""
。このサンプルは、文字列であるので、しかし、私はetree.XML()
を使用します。
tree = etree.XML(content)
XMLツリー内の要素を検索する自然な方法は、XPathを使用しています。
loc_list = tree.xpath("//url/loc")
をしかし、あなたは何を得るんでしょう:たとえば、あなたがそれを行うことができます「http://www.crawlingcourse.com/sitemap/1.3」:
for loc in loc_list:
print(loc.text)
# None
理由は、それはあなたの問題はおそらく、<urlset>
は、デフォルトの名前空間を使用することです。
これを機能させるには、この名前空間にxpath()
関数を使用する必要があります。このようなあなたのXPath式でs
接頭辞を使用し、その後
NS = {'s': "http://www.crawlingcourse.com/sitemap/1.3"}
:「S」:のは、この名前空間に名前を挙げてみましょう、あなたのXMLがインデントされるので
loc_list = tree.xpath("//s:url/s:loc", namespaces=NS)
for loc in loc_list:
print(loc.text)
# http://www.crawlingcourse.com/item-3911512
、あなたがストリップする必要がありますスペース:
for loc in loc_list:
url = loc.text.strip()
print(url)
# http://www.crawlingcourse.com/item-3911512
これまでのコードはどのようになっていますか?どのように動作していないのですか? – larsks
この例では、XMLが正しい(すべての要素が閉じられている、doctypeなど)ことを確認したいだけですか? – Eugene