2017-04-13 17 views

答えて

1

を取得していないのですあなたのコードは私のために仕事をして

<!-- 
<a href="https://link.com" target="_blank"><i class="foobar"></i> </a>   
--> 

それは私のタグに、そのクラスに基づいて取得する必要があります - それはリストを返します<a>あなたがhrefのリストは、要素そのものじゃないしたい場合は、/@hrefを追加します。

hrefs = tree.xpath('//a[i/@class="foobar"]/@href') 

あなたはまた、最初に戻って<a>秒に取得する/parent::*(または単に/..)を使用し、その後、<i> Sを見つけることができます。

hrefs = tree.xpath('//a/i[@class="foobar"]/../@href') 
#     ^    ^^ 
#      |     | obtain the 'href' 
#      |     | 
#      |     get the parent of the <i> 
#      | 
#      find all <i class="foobar"> contained in an <a>. 

これらのすべてがうまくいかない場合は、ドキュメントの構造が正しいかどうかを確認したい場合があります。

XPathはコメント<!-- -->の中を覗いていないことに注意してください。 <a>が実際にコメント<!-- -->の中にある場合、最初に手動で文書を抽出する必要があります。

hrefs = [href for comment in tree.xpath('//comment()') 
       # find all comments 
       for href in lxml.html.fromstring(comment.text) 
       # parse content of comment as a new HTML file 
           .xpath('//a[i/@class="foobar"]/@href') 
           # read those hrefs. 
] 
+0

'// a/@ href'だけではなく、なぜ好奇心が強いのですか? – SomeDude

+0

@svasa OPは "*私はタグでそのクラスに基づいて取得する必要があります*" – kennytm

+0

Okは見ていませんでした。とった。 – SomeDude

0

あなたは、そのターゲット要素がHTMLコメントであることに注意すべきです。 <a>からのコメントXPathのように"//a"のように単純に得ることはできません。この場合はノードではなく、単純な文字列です。コードの下

試してみてください。

import re 

foo_links = tree.xpath('//comment()') # get list of all comments on page 
for link in foo_links: 
    if '<i class="foobar">' in link.text: 
     href = re.search('\w+://\w+.\w+', link.text).group(0) # get href value from required comment 
     break 

P.S.より複雑な正規表現を使用してリンクに一致させる必要があるかもしれません。URL

+0

これは最善の動作をしているようです。コメント/ <! - は大雑把なものです。 URLの残りの部分を取得するために余分な。\ w +を追加しました。何らかの理由で、私は一度に1つのレコードしか取得しません。実行するたびに別のレコードを取得します。おそらく、私が作成しているリストに追加する私といくつかの問題。ありがとうございました –

+0

'break'を削除しました。 –

関連する問題