3

我需要设计一个程序,在整个维基百科的文章集合中找到特定的四五个单词短语(是的,我知道它有很多页面,而且我不需要回答称我为这样做的白痴)。

我以前没有编写过很多这样的东西,所以有两个问题我非常感谢一些帮助:

  • 首先,我将如何让程序爬过所有页面(即不对数百万页面中的每一个进行硬编码。我已将所有文章下载到我的硬盘上,但我不确定我怎么能告诉程序遍历文件夹中的每一个) 编辑- 我的硬盘上有所有维基百科文章

  • 页面快照中有图片和表格。我将如何仅提取文章的正文?

非常感谢您对任何一个问题的帮助!

4

4 回答 4

6

而不是手动爬取页面,速度较慢且可能被阻止,您应该下载官方数据转储。这些不包含图像,因此第二个问题也得到了解决。

编辑:我看到你的电脑上有所有的文章,所以这个答案可能没有多大帮助。

于 2012-04-06T04:35:12.493 回答
2

页面快照中有图片和表格。我将如何仅提取文章的正文?

如果您可以在表格中找到短语,您可以尝试直接使用正则表达式,但更好的选择是使用解析器并删除所有标记。你可以使用Beautiful Soup来做到这一点(你也需要 lxml):

from bs4 import BeautifulSoup
# produces an iterable generator that returns the text of each tag in turn
gen = BeautifulSoup(markup_from_file, 'xml').stripped_strings
list_of_strings = [x for x in gen] # list comprehension generates list
' '.join(list_of_strings)

BeautifulSoup 生成 unicode 文本,所以如果你需要更改编码,你可以这样做:

list_of_strings = map(lambda x: x.encode('utf-8'),list_of_strings)

此外,Beautiful Soup 可以帮助您更好地浏览和选择每个文档。如果您知道数据转储的编码,那肯定会帮助它更快。作者还说它在 Python 3 上运行得更快。

于 2012-04-06T06:16:02.783 回答
0

您问:

我已将所有文章下载到我的硬盘上,但我不确定如何让程序遍历文件夹中的每一篇

假设所有文件都在目录树结构中,您可以使用os.walk链接到 Python 文档和示例)访问每个文件,然后使用以下内容在每个文件中搜索短语:

for line in open("filename"):
    if "search_string" in line:
        print line

当然,这个解决方案不会出现在《Python Perf》杂志的封面上,但是我是 Python 新手,所以我会拉 n00b 卡。使用 Python 的预烘焙模块在文件中进行 grep 可能有更好的方法。

于 2012-04-06T04:47:46.633 回答
0

要点 1:Python 有一个模块仅用于递归迭代路径中的每个文件或目录,os.walk.

第 2 点:您似乎在这里问的是如何区分图像文件和文本文件。该magic模块可在奶酪店获得,为同名的标准 unix 实用程序提供 python 绑定(通常调用为file(1)

于 2012-04-06T04:42:48.840 回答