如何使用Python机械化单击下面的图像?
<a href="..."><img name="next" id="next" src="..."></a>
我知道要点击的图片的名称和ID。我需要以某种方式识别父链接并单击它。我怎么能?
奖金问题:如何检查是否有这样的图像?
答案 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,但我希望它是一个有用的指针。祝你好运!