用Python 3(Beautiful Soup)抓取网站并导出可见文本到文档

1 投票
2 回答
2642 浏览
提问于 2025-04-19 07:28

问题:我正在尝试使用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)

撰写回答