gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:05:12 25 4
gpt4 key购买 nike

我正在尝试使用 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>

换句话说,我想要跟踪每个具有“office-holder”类或 URL 中具有/people/的链接。我已经尝试过以下代码,但没有成功。

import mechanize

br = mechanize.Browser()
response = br.open("http://hansard.millbanksystems.com/offices/prime-minister")
links = br.links(url_regex="/people/")

print links

我正在尝试打印链接,以便在编写更多代码之前确保获得正确的链接/信息。我从中得到的错误(?)是:

<generator object _filter_links at 0x10121e6e0>

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

最佳答案

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

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

for link in links:
print link

等等。但你只能按照它定义的顺序访问事物;您不一定可以执行link[5],并且一旦您遍历完迭代器,它就用完了。

对于大多数用途来说,生成器只是一个迭代器,不一定提前知道其所有结果。这在generator expressions中非常有用。 ,您实际上可以编写非常简单的函数,使用yield关键字返回生成器:

def odds():
x = 1
while True:
yield x
x += 2

os = odds()
os.next() # returns 1
os.next() # returns 3

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

<小时/>

无论如何,如果您只想打印 links 的内容,您可以使用 list() 函数将其转换为列表(该函数采用可迭代和返回其元素的列表):

 print list(links)

或者使用列表理解创建一个字符串列表:

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

或者遍历它的元素并将它们打印出来:

 for l in links:
print l.url

但请注意,执行此操作后,链接 将“耗尽” - 因此,如果您想实际使用它执行任何操作,则需要再次获取它。

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

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 中包含 /people/ 和/或具有 office-holder 类的链接 URL,且没有重复项。 (请注意,您不能将 Link 对象直接放入集合中,因为它们不可散列。)

关于python - 在 Python 中使用 Mechanize 打开多个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8378556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com