我需要设计一个程序,在整个维基百科的文章集合中找到特定的四五个单词短语(是的,我知道它有很多页面,而且我不需要回答称我为这样做的白痴)。
我以前没有编写过很多这样的东西,所以有两个问题我非常感谢一些帮助:
首先,我将如何让程序爬过所有页面(即不对数百万页面中的每一个进行硬编码。我已将所有文章下载到我的硬盘上,但我不确定我怎么能告诉程序遍历文件夹中的每一个) 编辑- 我的硬盘上有所有维基百科文章
页面快照中有图片和表格。我将如何仅提取文章的正文?
非常感谢您对任何一个问题的帮助!
而不是手动爬取页面,速度较慢且可能被阻止,您应该下载官方数据转储。这些不包含图像,因此第二个问题也得到了解决。
编辑:我看到你的电脑上有所有的文章,所以这个答案可能没有多大帮助。
页面快照中有图片和表格。我将如何仅提取文章的正文?
如果您可以在表格中找到短语,您可以尝试直接使用正则表达式,但更好的选择是使用解析器并删除所有标记。你可以使用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 上运行得更快。
您问:
我已将所有文章下载到我的硬盘上,但我不确定如何让程序遍历文件夹中的每一篇
假设所有文件都在目录树结构中,您可以使用os.walk
(链接到 Python 文档和示例)访问每个文件,然后使用以下内容在每个文件中搜索短语:
for line in open("filename"):
if "search_string" in line:
print line
当然,这个解决方案不会出现在《Python Perf》杂志的封面上,但是我是 Python 新手,所以我会拉 n00b 卡。使用 Python 的预烘焙模块在文件中进行 grep 可能有更好的方法。