1

如何使用 Python mechanize 单击如下图?

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

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

额外问题:我如何检查是否有这样的图像?

4

3 回答 3

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:以后再做,但由于这可能不适用于您的网站,所以这样做是安全的。见下文。

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

于 2013-01-01T18:41:02.513 回答
0

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

您还可以查看比我回答的更聪明的人的线程- 它似乎讨论了一个名为 SpiderMonkey 的库以及无法机械化单击按钮。

于 2013-01-01T14:44:04.010 回答
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"]部分,您可以使用其他属性,例如 this://img[@name="bla bla"]并且它将完美地工作。您只需要考虑哪种属性更适合这种情况。

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

于 2013-01-01T16:07:30.287 回答