用Python 3(Beautiful Soup)抓取网站并导出可见文本到文档
问题:我正在尝试使用beautifulsoup从多个网站抓取可见的文本,然后把所有数据导出到一个文本文件中。
这个文件将用作一个语料库,以便使用NLTK寻找词语搭配。目前我做的差不多是这样,但任何帮助都非常感谢!
import requests
from bs4 import BeautifulSoup
from collections import Counter
urls = ["http://en.wikipedia.org/wiki/Wolfgang_Amadeus_Mozart","http://en.wikipedia.org/wiki/Golf"]
for url in urls:
website = requests.get(url)
soup = BeautifulSoup(website.content)
text = [''.join(s.findAll(text=True))for s in soup.findAll('p')]
with open('thisisanew.txt','w') as file:
for item in text:
print(file, item)
不幸的是,这里有两个问题:当我尝试把文件导出为.txt文件时,它是完全空白的。
有什么想法吗?
2 个回答
1
还有一个问题:你只是在最后一个网址上收集文本,也就是一直在重新给 text
变量赋值。
在循环开始之前,先把 text
定义为空列表,然后在里面添加新数据:
text = []
for url in urls:
website = requests.get(url)
soup = BeautifulSoup(website.content)
text += [''.join(s.findAll(text=True))for s in soup.findAll('p')]
4
print(file, item)
应该改成 print(item, file=file)
。
但是不要把你的文件命名为 file
,因为这样会覆盖掉 Python 自带的 file
功能,像这样命名会更好:
with open('thisisanew.txt','w') as outfile:
for item in text:
print(item, file=outfile)
要解决下一个问题,也就是覆盖第一个网址的数据,你可以把写文件的代码放进循环里,并在进入循环之前先打开文件:
import requests
from bs4 import BeautifulSoup
from collections import Counter
urls = ["http://en.wikipedia.org/wiki/Wolfgang_Amadeus_Mozart","http://en.wikipedia.org/wiki/Golf"]
with open('thisisanew.txt', 'w', encoding='utf-8') as outfile:
for url in urls:
website = requests.get(url)
soup = BeautifulSoup(website.content)
text = [''.join(s.findAll(text=True))for s in soup.findAll('p')]
for item in text:
print(item, file=outfile)