2011-10-26 15 views
1

私はいくつかのhtmlを解析しようとしていますが、私はこの小さなhtmlコードでいくつか問題があります。htmlをlxml(タグh3)で解析する

XML:

<div> 
    <p><span><a href="../url"></a></span></p> 
    <h3 class="header"><a href="../url">Other</a></h3> 
    <a href="../url">Other</a><br> 
    <a class="aaaaa" href="../url">Indice</a> 
    <p></p>    
</div> 

コード:

import urllib 
from lxml import etree 
import StringIO 
resultado=urllib.urlopen('trozo.html') 
html = resultado.read() 
parser= etree.HTMLParser() 
tree=etree.parse(StringIO.StringIO(html),parser) 
xpath='/div/h3' 
html_filtrado=tree.xpath(xpath) 
print html_filtrado 

私はそれは[]が表示されたコードを印刷し、私はそれはそれで<h3 class="header"><a href="../url">Other</a></h3>持つリストでなければならないこととし。 もし私がそのリストを持っていたら、etree.tostring(html_filtrado)を実行して<h3 class="header"><a href="../url">Other</a></h3>を見てください。

このコードはどのように取得できますか?

<h3 class="header"><a href="../url">Other</a></h3> 

../url?それは私が欲しい部分です!

はあなたに

+0

をあなたが投稿 '閉じタグなし
が' 'lxml'を有効にするために、まず、ライブラリを解析する最もXMLのためである、違法XMLで、** XMLに準拠しないもの破損したHTMLでは、パーサーにいくつかのフラグを設定する必要があります。代わりにHTMLパーサを使用するか、HTMLをXHTMLに変換してみてください。 –

+0

しかし、私は問題なしで多くのページを解析しています。
!!だから、私はどのフラグを使用する必要がありますか?私はこのパーサーが本当に好きなので、本当に速いです! – dani

答えて

3

ありがとう場合は、HTMLを受信したときにetree.HTMLParserは()、それは完全なHTML DOMツリーを作成すること、です。あなたはetree.tostring(木)を使用する場合 だから、あなたが意図したものではなく、あなたが得る

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><div> 
<p><span><a href="../url"/></span></p> 
<h3 class="header"><a href="../url">Other</a></h3> 
<a href="../url">Other</a><br/><a class="aaaaa" href="../url">Indice</a> 
<p/>    

ので、正しいXPathはなり '/ HTML /ボディ/ DIV/H3'

+0

それは動作しません! :(これは大きな文書の一部であり、xpathは '/html/body/......//div/h3'です。それはうまくいかず、h3の問題です。 div。そして、それはh3タグを再調整しません。 – dani

+0

文書全体をサンプルしてもらえますか?明らかに、その部分はあなたの構造に何が問題であるかを知るには不十分です。もちろん、この質問の2番目の答えに固執することはできますが、最適ではありません:)あるいは、実際にはHTMLParser()がデフォルトで壊れたHTMLを修正している可能性があります。余分なHTMLタグを含んでいて、to_string()を使って構造体をもう一度見てみてください。 –

+0

あなたは正しいです!パーサーは構造を変更しました! – dani

4

例のXPathクエリは正しくありません。

divタグ内のすべてのh3タグのリストを取得するには、あなたがこれを使用する必要があります。

与えるべき
elements = tree.xpath('//div/h3') 
etree.tostring(elements[0]) 

'<h3 class="header"><a href="../url">Other</a></h3>\n' 

aすべてのタグhref属性のリストを取得するにはh3タグ内で、次のようなものを使用できます。

tree.xpath('//h3/a/@href') 

与える:

['../url'] 
+0

ありがとうございます!!!!!それは私のために働く!私はxpathについてもっと学ばなければならないと思います。ありがとうございました – dani

関連する問題