Python mechanize を使用して以下のような画像をクリックするにはどうすればよいですか?
<a href="..."><img name="next" id="next" src="..."></a>
クリックしたい画像の名前とIDを知っています。どういうわけか親リンクを特定してクリックする必要があります。どうやって?
おまけの質問: そのような画像があるかどうかを確認するにはどうすればよいですか?
mechanize を使用するよりも、bs4 (beautifulsoup 4) を使用する方が非常に簡単です。
from bs4 import BeautifulSoup
import urllib2
text = urllib2.urlopen("http://yourwebpage.com/").read()
soup = BeautifulSoup(text)
img = soup.find_all('img',{'id':'next'})
if img:
a_tag = img[0].parent
href = a_tag.get('href')
print href
親タグを取得することは、もちろん関数 .parent
でタグを見つけた後に起こるので、bs4 では非常に簡単です。find_all
下記参照。find_all
関数は配列を返すため、将来的にはこれを行うのが最善ですがif img:
、これは Web サイトには当てはまらない可能性があるため、安全に行うことができます。
編集:「ボーナスの質問」を含めるようにコードを変更しました。これは、上記で代替として説明したものです。
まあ、私は Mechanize を使用してそれを行う方法を知りませんが、使用する方法は知っていますlxml
:
ウェブページに次のコードがあると仮定しましょう:
<a href="page2.html"><img name="bla bla" id="next" src="Cat.jpg"></a>
. を使用しlxml
て、次のコードを記述します。
from lxml import html
page = urlllib2.urlopen('http://example.com')
tree = html.fromstring(page.read())
link = tree.xpath('//img[@id="next"]/ancestor::a/attribute::href')
魔法のほとんどは、tree.xpath
最初に で探している画像を定義し、次にその直前//img[@id="next"]
のタグを探していることを指定し、特に属性を探していることを指定する関数で発生します: 。link 変数には、そのクエリに一致する文字列のリストが含まれるようになりました。この場合は link[0] になります。これを効果的にクリックすることができます。a
/ancestor::a
href
/attribute::href
page2.html
urlopen()
パーツについては//img[@id="next"]
、たとえば this: などの他の属性を使用できます。これ//img[@name="bla bla"]
は完全に正常に機能します。この状況にどの属性が適しているかを考える必要があります。
この回答が Mechanize を使用していないことはわかっていますが、参考になることを願っています。幸運を!