在Python中使用Mechanize打开多个页面

2024-06-11 09:38:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用mechanize按照某种格式打开多个页面。我想从一个特定的页面开始,然后让mechanize跟踪所有链接,这些链接中有一个特定的类或文本片段。例如,根url应该类似于

http://hansard.millbanksystems.com/offices/prime-minister

我想跟踪页面上的每一个链接

<li class='office-holder'><a href="http://hansard.millbanksystems.com/people/mr-tony-blair">Mr Tony Blair</a> May  2, 1997 - June 27, 2007</li>

换言之,我希望跟踪每个在URL中有“officeholder”类或/people/的链接。我试过下面的代码,但是没有用。在

^{pr2}$

我正在尝试打印这些链接,这样我就可以确保在编写更多代码之前获得正确的链接/信息。误差(?)我得到的结论是:

<generator object _filter_links at 0x10121e6e0>

如有任何建议或提示,我们将不胜感激。在


Tags: 代码文本comhttpurl链接格式页面
1条回答
网友
1楼 · 发布于 2024-06-11 09:38:24

这不是错误-这意味着Browser.links()返回的是生成器对象而不是列表。在

iterator是一个“类似于列表”的对象,意味着您可以执行以下操作

for link in links:
    print link

等等。但是您只能按它定义的任何顺序访问它;您不必执行link[5],一旦遍历了迭代器,它就用完了。在

在大多数情况下,生成器只是一个迭代器,它不一定事先知道它的所有结果。这在generator expressions中非常有用,您实际上可以编写非常简单的函数来返回带有yield关键字的生成器:

^{pr2}$

这是一件好事,因为这意味着您不必一次将所有数据存储在内存中(这对于odds()来说是不可能的……),而且如果您只需要结果的前几个元素,则不必费心计算其余元素。^{} module有许多处理迭代器的方便函数。在


无论如何,如果您只想打印出links的内容,可以使用list()函数将其转换为一个列表(它接受iterable并返回其元素的列表):

 print list(links)

或者列出一个包含列表理解的字符串列表:

 print [l.url for l in list(links)]

或者浏览其元素并将其打印出来:

 for l in links:
      print l.url

但是请注意,在您这样做之后,links将“耗尽”—因此,如果您想实际使用它做任何事情,您需要再次获得它。在

也许最简单的选择是立即将其转换为列表,而不必担心它是迭代器:

links = list(br.links(url_regex="/people/"))

而且,你显然还没有得到你想要的类的链接。这里可能有一些mechanize的诀窍来做“或”,但是使用集合和生成器表达式来实现这一点的一个很好的方法是这样的:

 links = set(l.url for l in br.links(url_regex='/people/'))
 links.update(l.url for l in br.get_links_with_class('office-holder'))

显然,将get_links_with_class替换为获取这些链接的真正方法。然后,您将得到一组所有的链接URL,它们的URL中有/people/和/或具有类office-holder,没有重复项。(请注意,您不能将Link对象直接放入集合中,因为它们不可散列。)

相关问题 更多 >