2012-01-03 7 views
2

htmlコードはブラインドで、htmlには文字列 "PRICE"が含まれています。その部分文字列はhtmlテキストと一致しなければなりません。もしxpathを使ってテキストが一致すれば(部分一致)、特定のhtmlタグのパスを返すべきです。xpathを使用して部分文字列一致のhtmlタグを取得します

注:私は、複数のsites.Iために、このロジックを自動化する必要がは(親タグをフェッチ、「価格」を見つけるための)一般的なルール を使用する必要があります

これは一例です:

html="""<div id = "price_id"> 
    <span id = "id1"></span> 
    <div class="price_class"> 
    <bold> 
    <strong> 
    <label>PRICE:</label> 125 Rs. 
    </bold> 
    </strong> 
    </br> 
    </br> 

</div>""" 

私はlxmlの

それはXPath式を使用して書かれるだろうか
from lxml.html.clean import Cleaner  

cleaner =Cleaner(page_structure=False) 
cl = cleaner.clean_html(html) 
cleaned_html = fromstring(cl) 

for element in cleaned_html: 
     if element.text == 'PRICE': 
      print "matched" 

を使用?

xpath式を使用してdivクラスパスを取得するだけで済みます。

また、「PRICE:」という文字列を見つけた場合に問題が発生します。 親の有効なタグは、クラス名が「price_class」の「div」である必要があります。 しかし、ここで私はあなたがある文字列の親有効なタグを取得するために私を提案してくださいでした... にフォント、太字、斜体などの不要なタグをスキップしたり、削除

を持っている必要がありますか?

答えて

2

あなたはancestor軸を使用することができます。

import lxml 

html = ... 
doc = lxml.html.fromstring(html) 

for element in doc.xpath('//label[contains(text(), "PRICE:")]/ancestor::div[@class="price_class"]'): 
    print 'Found %s: %s' % (element.tag, element.text_content().strip()) 

出力:

Found div: PRICE: 125 Rs. 

EDIT:それが持つ要素を検索します

doc.xpath('//*[contains(text(), "PRICE:")]/\ 
      ancestor::*[not(self::strong|self::bold|self::italic)][1]') 

:変更された質問に対するより一般的なソリューションテキスト "PRICE:"最初の祖先をスキップしてstrongbolditalicを選択します。リストを除外するタグを追加できます。

は、代わりに(のようなdivul、など)は、まず良い祖先を検索することができ、除外リスト:

doc.xpath('//*[contains(text(), "PRICE:")]/ancestor::*[self::div|self::ul][1]') 
+0

ここではHTMLソースコードが表示されません。したがって、属性とタグを手動で使用することはできません。別のサイトでは、タグとクラスは正しく変更されますか?私は多くのサイトでこのロジックを自動化する必要があります。ここでは(ラベル、price_class)を言及するのではなく、ゲラールルール – Nava

+0

@サラバナを使用する必要があります。 – reclosedev

+0

おかげで友人:-)私は疑問を持っています。私は大文字を大文字に変換する必要があります()。私は大文字(text())の 'price'を試しましたが、 – Nava

0

私はちょうどXPath式を使用してdivのクラスパスを取得する必要があります。文字列

使用::私は "PRICE" を見つけた場合

//*[contains(text(), 'PRICE')]/ancestor::div[1]/@class 

も問題があります。 クラス名が "price_class"の "div"という親の有効なタグを取得する必要があります。 ここでは、私はスキップするか、 フォント、太字、イタリックのような不要なタグを削除する必要があります...

XPathはXMLドキュメントのクエリ言語です。したがって、XML文書の構造を変更することはできません。これを行うには、別の言語(XPathのホスティング)を使用する必要があります。

XSLTは、特にその目的で設計されたXML文書の変換を実行するのに最も適した言語です。

関連する問題