我在一个csv文件中有一个网站列表,我希望从中抓取所有可见的文本并保存为单独的txt文件。
我现在可以抓取这些网站,但是它们带有完整的HTML代码。我有一个脚本(如下),它将删除该代码并为我提供可见的文本,但是我在最后的步骤上遇到了麻烦。
import urllib.request
import csv
import pandas as pd
from bs4 import BeautifulSoup
from bs4.element import Comment
df = pd.read_csv('~/ids.csv', sep = ',')
df.head()
def tag_visible(element):
if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
return False
if isinstance(element, Comment):
return False
return True
def text_from_html(body):
soup = BeautifulSoup(body, 'html.parser')
texts = soup.findAll(text=True)
visible_texts = filter(tag_visible, texts)
return u" ".join(t.strip() for t in visible_texts)
for i in df.message_id:
fp = urllib.request.urlretrieve('url='+str(i))
l = text_from_html(fp) #<<<---ERROR HERE
file = open(str(i)+".txt","w",encoding='utf-8')
file.close()
file.write(l)
我得到一个TypeError: expected string or bytes-like object
。抱歉,这可能是一个基本问题。
答案 0 :(得分:3)
您缺少括号。
fp = urllib.request.urlretrieve('url='+str(i))
^
答案 1 :(得分:0)
花点时间,但下面的代码有效。请注意,urls.csv文件包含一栏,标题为“ urls”。
import os
import requests
import urllib.request
import csv
import pandas as pd
from bs4 import BeautifulSoup
from bs4.element import Comment
from collections import Counter
df = pd.read_csv('/urls.csv', sep = ',')
df.head()
def tag_visible(element):
if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
return False
if isinstance(element, Comment):
return False
return True
def text_from_html(body):
soup = BeautifulSoup(body, 'html.parser')
texts = soup.findAll(text=True)
visible_texts = filter(tag_visible, texts)
return u" ".join(t.strip() for t in visible_texts)
for i in df.urls:
fp = urllib.request.urlopen(i).read()
l = text_from_html(fp)
s = i[60:]
file = open(str(s)+".txt","w",encoding='utf-8')
file.write(l)
file.close()