我需要设计一个程序,在整个维基百科文章集中找到一些四或五个单词短语(是的,我知道它的页面很多,而且我不需要回答我这样做是个白痴)。
我之前没有编写过这样的东西,所以有两个问题我会非常感谢一些帮助:
首先,我将如何让程序抓取所有页面(即不对每百万页中的每一页进行硬编码。我已将所有文章下载到我的硬盘上,但我'我不知道如何告诉程序迭代文件夹中的每一个) 编辑 - 我的硬盘上有所有维基百科文章
页面的快照中包含图片和表格。我如何仅提取文章的正文?
非常感谢您对这两个问题的帮助!
答案 0 :(得分:6)
您应该下载official datadump,而不是手动抓取,速度较慢且可以阻止的页面。这些不包含图像,所以第二个问题也解决了。
编辑:我看到你的计算机上有所有文章,所以这个答案可能没多大帮助。答案 1 :(得分:2)
页面的快照中包含图片和表格。怎么会 我只提取了文章的正文?
如果您可以在表格中找到短语,可以尝试直接使用regular expressions,但更好的选择是使用解析器并删除所有标记。您可以使用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上运行得更快。
答案 2 :(得分:0)
要点1:Python有一个模块,仅用于递归迭代路径os.walk
的每个文件或目录。
第2点:您在这里要问的是如何区分图像文件和文本文件。奶酪商店提供的magic
模块为同名的标准unix实用程序提供python绑定(通常调用为file(1)
)
答案 3 :(得分:0)
你问:
我已将所有文章下载到我的硬盘上,但我不是 确定我如何告诉程序迭代每个程序 夹
假设所有文件都在目录树结构中,您可以使用os.walk
(link到Python文档和示例)访问每个文件,然后使用{s}搜索每个文件中的短语类似的东西:
for line in open("filename"):
if "search_string" in line:
print line
当然,这个解决方案不会出现在“Python Perf”杂志的封面上,但我是Python的新手,所以我会拉n00b卡。使用Python的预烘焙模块可能有更好的方法在文件中进行grep。