如何使用 Python mechanize 单击如下图?
<a href="..."><img name="next" id="next" src="..."></a>
我知道要点击的图像的名称和 ID。我需要以某种方式识别父链接并单击它。我怎样才能?
额外问题:我如何检查是否有这样的图像?
而不是使用机械化,使用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:
以后再做,但由于这可能不适用于您的网站,所以这样做是安全的。
编辑:我已更改代码以包含“奖金问题”,这是我在上面描述的替代方案。
对于您的奖金问题-我想说您可以使用 BeautifulSoup 来检查 img 元素是否有效。您可以使用 urllib 来查看图像是否存在(至少,服务器是否会将其传递给您 - 否则您将收到错误消息)。
您还可以查看比我回答的更聪明的人的线程- 它似乎讨论了一个名为 SpiderMonkey 的库以及无法机械化单击按钮。
好吧,我不知道如何使用 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"]
并且它将完美地工作。您只需要考虑哪种属性更适合这种情况。
我知道这个答案不使用机械化,但我希望它是一个有用的指针。祝你好运!