从列表中抓取网站,解析全文,另存为txt文件-Python

时间:2019-07-17 17:39:41

标签: python beautifulsoup

我在一个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。抱歉,这可能是一个基本问题。

2 个答案:

答案 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()