Beautifulsoup - get_text,单行输出
Posted
技术标签:
【中文标题】Beautifulsoup - get_text,单行输出【英文标题】:Beautifulsoup - get_text, output in a single line 【发布时间】:2015-12-27 16:09:03 【问题描述】:我正在尝试提取下一页的文本并将其保存到 CSV 文件的单个单元格中。但是,我总是在看不到任何“特殊”字符的地方出现换行符(即即使文本中没有“\n”、“\t”等)。 CSV 文件的第二行也有多个非空单元格,而不是仅将文本保存到单个单元格中。
代码如下:
# -*- coding: utf-8 -*-
#Python3.x
import urllib
from bs4 import BeautifulSoup
import requests, urllib, csv, re, sys
csvfile=open('test.csv', 'w', encoding='cp850', errors='replace')
writer=csv.writer(csvfile)
list_url= ["http://www.sec.gov/Archives/edgar/data/1025315/0000950127-05-000239.txt"]
for url in list_url:
base_url_parts = urllib.parse.urlparse(url)
while True:
raw_html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(raw_html)
#### scrape the page for the desired info
text_10k=[]
ten_k=soup.get_text()
ten_k=ten_k.strip().replace("\t", " ").replace("\r", " ").replace('\n', ' ')
text_10k.append(ten_k)
#Zip the data
output_data=zip([text_10k])
#Write the observations to the CSV file
writer=csv.writer(open('test_10k.csv','a',newline='', encoding='cp850', errors='replace'))
writer.writerows(output_data)
csvfile.flush()
我确信我的错误很简单,但是自从我使用 Python 以来已经有几个月了……我绝对可以使用复习。非常感谢!
编辑:输出太长,无法完整复制,但这里有一个例子:
第 1 行,单元格 1:['-----BEGIN PRIVACY-ENHANCED MESSAGE-----\nProc-Type ..... -8-", '工作上限的变化 第 2 行,单元格 1:tal 主要归因于 \nyear 第 2 行,单元格 2:以及因支付长期应付票据而导致的现金减少。\n\n
我希望所有内容都在一个单元格中(第 1 行,第 1 行),没有换行符。所以: Line 1, Cell 1: ['-----BEGIN PRIVACY-ENHANCED MESSAGE-----\nProc-Type ..... -8-", '工作资本的变化主要是由于\n年以及因支付长期应付票据而导致的现金减少。\n\n
*请注意,在第 1 行和第 2 行之间拆分时,单词“capital”中缺少“i”。不确定是什么导致该行以这种方式中断。
EDIT2:我通过保存为 .txt 文件使其工作(只要我在 Notepad++ 或类似的东西中打开输出就可以正常工作)。不过,我仍然不知道为什么它不能用作 CSV。
【问题讨论】:
你得到了什么输出,你期望得到什么? 您可以更新问题中的示例吗?还要指出您在其中发现的意外情况 你在哪里检查这个?一切都在一行中,尽管我会说您创建的根本不是 csv 格式 我知道 get_text 应该创建一个字符串(行),但是当我打开它时,代码写入的 CSV 文件有不止一行(如上所示),即使只有一个文件在 url 列表中(因此,应该只有一个来自 get_text 的非常长的字符串)。 您作为输出显示的内容不能来自给定的源代码,因为那里的 '\n' 字符被空格替换。您还混合了不同的文件对象。csvfile.flush()
无效,因为您使用另一个文件对象附加到文件。
【参考方案1】:
看起来在While True:
中,程序最终会永远卡在一个while 循环中。将其更改为 if url:
应该让它每个 url 运行一次。我应该注意,在我添加“lxml”作为 BeautifulSoup soup = BeautifulSoup(raw_html, 'lxml'
的解析器之前它不会运行。这似乎将每个 url 的信息放入一个单元格中。由于单元格中的信息量太大,它可能无法在标准电子表格中显示。
# -*- coding: utf-8 -*-
# Python3.x
from bs4 import BeautifulSoup
import urllib
import csv
csvfile = open('test.csv', 'w', encoding='cp850', errors='replace')
writer = csv.writer(csvfile)
list_url = ["http://www.sec.gov/Archives/edgar/data/1025315/0000950127-05-000239.txt"]
for url in list_url:
base_url_parts = urllib.parse.urlparse(url)
if url:
raw_html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(raw_html, 'lxml')
#### scrape the page for the desired info
text_10k = []
ten_k = soup.get_text()
ten_k = ten_k.strip().replace("\t", " ").replace("\r", " ").replace('\n', ' ')
text_10k.append(ten_k)
#Zip the data
output_data=zip([text_10k])
#Write the observations to the CSV file
writer=csv.writer(open('test_10k.csv','a',newline='', encoding='cp850', errors='replace'))
writer.writerows(output_data)
csvfile.flush()
【讨论】:
以上是关于Beautifulsoup - get_text,单行输出的主要内容,如果未能解决你的问题,请参考以下文章
BeautifulSoup get_text 不会去除所有标签和 JavaScript
来自 find_all 的 BeautifulSoup get_text