单击具有特定名称的图像

时间:2012-12-30 14:34:00

标签: python mechanize

如何使用Python机械化单击下面的图像?

<a href="..."><img name="next" id="next" src="..."></a>

我知道要点击的图片的名称和ID。我需要以某种方式识别父链接并单击它。我怎么能?

奖金问题:如何检查是否有这样的图像?

3 个答案:

答案 0 :(得分:5)

与使用机械化相比,使用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

使用bs4检索父标记非常简单,因为在使用.parent函数找到标记之后,它会发生在find_all以下。 find_all函数返回一个数组时,最好在将来执行if img:,但由于这可能不适用于您的网站,所以这样做是安全的。见下文。

编辑:我已经更改了代码以包含“奖金问题”,这是我上面作为替代方案所描述的。

答案 1 :(得分:0)

对于你的奖金问题 - 我会说你可以使用BeautifulSoup来检查img元素是否有效。您可以使用urllib查看图像是否存在(至少,服务器是否会将其传递给您 - 否则您将收到错误)。

您还可以查看this thread某人比我的回答更聪明 - 它似乎讨论了一个名为SpiderMonkey的库,并且无法机械化点击按钮。

答案 2 :(得分:0)

好吧,我不知道如何使用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"]定义要查找的图像,然后指定您正在查找a标记在它之前:/ancestor::a并且您正在寻找具体的href属性:/attribute::href。链接变量现在将包含与该查询匹配的字符串列表 - 在这种情况下,链接[0]将为page2.html - 您可以urlopen(),从而有效地单击它。

对于//img[@id="next"]部分,您可以使用其他属性,例如://img[@name="bla bla"],它将完全正常工作。您只需要考虑哪种属性更适合这种情况。

我知道这个答案不使用Mechanize,但我希望它是一个有用的指针。祝你好运!