【问题标题】:Python mechanize, following link by url and what is the nr parameter?Python mechanize,通过 url 跟随链接,nr 参数是什么?
【发布时间】:2011-04-03 22:24:40
【问题描述】:

很抱歉不得不问这样的问题,但 python 的机械化文档似乎确实缺乏,我无法弄清楚。他们只给出了一个我可以通过链接找到的示例:

response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1)

但我不想使用正则表达式,我只想根据其 url 跟踪一个链接,我该怎么做.. 还有什么是有时用于跟踪链接的“nr”?

感谢您提供任何信息

【问题讨论】:

  • 刚刚意识到我的标题中可能有一个错误,导致链接无法正常工作。感谢帮助我的人,我认为你的答案对我有用,我找到了另一个更直接的答案方法在另一个网站上做,所以我也会在这里发布以供参考

标签: python mechanize


【解决方案1】:

br.follow_link 采用 Link 对象或关键字 arg(例如 nr=0)。

br.links() 列出所有链接。

br.links(url_regex='...') 列出所有 url 与正则表达式匹配的链接。

br.links(text_regex='...') 列出了链接文本与正则表达式匹配的所有链接。

br.follow_link(nr=num) 跟随页面上的numth 链接,从 0 开始计数。它返回一个响应对象(与 br.open(...) 返回的类型相同)

br.find_link(url='...') 返回Link 对象,其url 完全等于给定的url。

br.find_linkbr.linksbr.follow_linkbr.click_link 都接受相同的关键字。运行 help(br.find_link) 以查看有关这些关键字的文档。

编辑:如果您有一个想要关注的目标网址,您可以这样做:

import mechanize
br = mechanize.Browser()
response=br.open("http://www.example.com/")
target_url='http://www.rfc-editor.org/rfc/rfc2606.txt'
for link in br.links():
    print(link)
    # Link(base_url='http://www.example.com/', url='http://www.rfc-editor.org/rfc/rfc2606.txt', text='RFC 2606', tag='a', attrs=[('href', 'http://www.rfc-editor.org/rfc/rfc2606.txt')])
    print(link.url)
    # http://www.rfc-editor.org/rfc/rfc2606.txt
    if link.url == target_url:
        print('match found')
        # match found            
        break

br.follow_link(link)   # link still holds the last value it had in the loop
print(br.geturl())
# http://www.rfc-editor.org/rfc/rfc2606.txt

【讨论】:

  • @Rick:如果您循环访问br.links(),您可以查看字符串link.url 来确定是否要关注它。不需要正则表达式。
  • 谢谢,我想我现在明白了……我不知道它是什么,但我拥有的 python mech 版本(最新版本)在它的文档中似乎没有太多内容文件,不知道为什么..无论如何,感谢您的帮助,我想我可以根据您所说的得到它,会尝试
  • 我仍然无法弄清楚如何获得要匹配的链接,我正在尝试使用正则表达式作为完整的 url,但它没有给出匹配(当我执行 for 循环时它永远不会进入暗示它没有得到任何匹配的循环)
  • @Rick:正则表达式很棘手。您的网址中的某些字符(例如.*+?()[])在正则表达式模式的上下文中都有不同的含义,而不是纯字符串比较。由于您拥有完整的 url,您可以使用 == 将 url 与 link.url 进行比较。我添加了一些代码来说明我的意思。
  • 谢谢,我有很多正则表达式经验 我认为问题在于我的标题有问题,感谢您的帮助,我找到了另一种不使用正则表达式的方法,所以我会发布供我测试后参考
【解决方案2】:

我找到了这种方法,供不想使用正则表达式的人参考:

r = br.open("http://www.somewebsite.com")
br.find_link(url='http://www.somewebsite.com/link1.html')
req = br.click_link(url='http://www.somewebsite.com/link1.html')
br.open(req)
print br.response().read()

或者,它也适用于链接的文本:

r = br.open("http://www.somewebsite.com")
br.find_link(text='Click this link')
req = br.click_link(text='Click this link')
br.open(req)
print br.response().read()

【讨论】:

  • 我喜欢这个解决方案比我建议的要好得多。 (我认为它甚至可以在没有调用br.find_link 的情况下工作)。请接受这个,这样它就会冒泡到顶部。
【解决方案3】:

通过查看代码,我怀疑您想要

response1 = br.follow_link(link=LinkObjectToFollow)

nr 与 find_link 调用中记录的相同。

编辑:在我粗略的一瞥中,我没有意识到“链接”不是一个简单的链接。

【讨论】:

  • 我在代码本身中找到了“nr”信息。 _mechanize.py in the doctext for find_link... 就在第 614 行附近
  • 哦,对了,我什至没有想到他们会有一个与在线版本不同的 doc 文件,因为我习惯了它也在线,谢谢你的提示
【解决方案4】:

nr 用于您所关注的链接的确切位置。 如果您的文本或网址是多个正则表达式。 默认值为 0 所以如果你使用默认值,你将完全遵循链接第一个正则表达式。 例如 来源:

<a href="link.html>Click this link</a>
<a href="link2.html>Click this link</a>

在本例中,我们需要跟随“单击此链接”文本,但我们选择 link2.html 完全跟随

br.click_link(text='Click this link', nr=1)

通过它你会得到link2.html响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多