【问题标题】:Scrape websites from a list, parse full text, save as txt file - Python从列表中抓取网站,解析全文,保存为 txt 文件 - Python
【发布时间】:2019-07-17 17:39:41
【问题描述】:

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

【问题讨论】:

  • 虽然与您的问题无关,但我注意到您在text_from_html() 写入文件之前关闭了您的文件。
  • 我意识到我在代码中遗漏了一个 ),感谢那些发表评论的人。但是,我仍然收到错误消息。我已经更新了上面的代码。
  • 您能否提供ids.csv 中内容的示例(例如前 10 行和列名)?
  • 你想从哪个 URL 读取?

标签: python beautifulsoup


【解决方案1】:

你缺少一个括号。

fp = urllib.request.urlretrieve('url='+str(i))
                                             ^

【讨论】:

  • 谢谢,这实际上是一个错字。我已经更新了问题。
【解决方案2】:

花了一些时间,但有效的代码如下。请注意,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()

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多