生成的 Beautiful Soup txt 文件中的文件编码未知
Unknown encoding of files in a resulting Beautiful Soup txt file
我下载了 13 000 个文件(来自不同公司的 10-K 报告),我需要提取这些文件的特定部分(第 1A 部分 - 风险因素)。问题是我可以在 Word 中轻松打开这些文件,它们非常完美,而当我在普通的 txt 编辑器中打开它们时,文档似乎是一个 HTML,最后有大量加密字符串(编辑:我怀疑这是由于这些文件的 XBRL 格式所致)。使用 BeautifulSoup 的结果也是如此。
我尝试使用在线解码器,因为我认为这可能与 Base64 编码有关,但似乎已知编码的 none 可以帮助我。我看到在一些文件的开头,有类似:"created with Certent Disclosure Management 6.31.0.1" 和其他程序,我想这可能是编码的原因。尽管如此,Word 还是能够打开这些文件,所以我想它一定有一个已知的密钥。这是示例编码数据:
M1G2RBE@MN)T='1,SC4,]%$$Q71T3<XU#[AHMB9@*E1=E_U5CKG&(77/*(LY9
ME$N9MY/U9DC,- ZY:4Z0EWF95RMQY#J!ZIB8:9RWF;\"S+1%Z*;VZPV#(MO
MUCHFYAJ'V#6O8*[R9L<VI8[I8KYQB7WSC#DMFGR[E6+;7=2R)N)1QXQ(K
MYQDS$>UJ65%MV4+(KBRHJ3HFIAR76#G/F$%=*9FOU*DM-6TSTC$Q\[C$YC$/
和 a sample file 来自我下载的 13 000 个。
下面我插入了我用来提取文本的 BeautifulSoup。它完成了它的工作,但我需要找到这个编码字符串的线索并以某种方式在下面的 Python 代码中对其进行解码。
from bs4 import BeautifulSoup
with open("98752-TOROTEL INC-10-K-2019-07-23", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'html.parser')
print(soup.getText())
with open("extracted_test.txt", "w", encoding="utf-8") as f:
f.write(soup.getText())
f.close()
我想要实现的是解码文件末尾的这个虚拟字符串。
好吧,这会有点混乱,但会让你足够接近你正在寻找的东西,而无需使用正则表达式(这在 html 中是出了名的问题)。您将面临的根本问题是 EDGAR 文件的格式非常不一致,因此适用于一个 10Q(或 10K 或 8K)文件的文件可能不适用于类似的文件(即使来自同一文件...)例如,单词 'item' 可能以小写或大写(或混合形式)出现,因此使用 string.lower()
方法等。所以在任何情况下都会进行一些清理。
话虽如此,下面的代码应该让您从两个文件(包括具有 none 的文件)中获取风险因素部分:
url = [one of these two]
from bs4 import BeautifulSoup as bs
response = requests.get(url)
soup = bs(response.content, 'html.parser')
risks = soup.find_all('a')
for risk in risks:
if 'item' in str(risk.attrs).lower() and '1a' in str(risk.attrs).lower():
for i in risk.findAllNext():
if 'item' in str(i.attrs).lower():
break
else:
print(i.text.strip())
祝你项目顺利!
我下载了 13 000 个文件(来自不同公司的 10-K 报告),我需要提取这些文件的特定部分(第 1A 部分 - 风险因素)。问题是我可以在 Word 中轻松打开这些文件,它们非常完美,而当我在普通的 txt 编辑器中打开它们时,文档似乎是一个 HTML,最后有大量加密字符串(编辑:我怀疑这是由于这些文件的 XBRL 格式所致)。使用 BeautifulSoup 的结果也是如此。
我尝试使用在线解码器,因为我认为这可能与 Base64 编码有关,但似乎已知编码的 none 可以帮助我。我看到在一些文件的开头,有类似:"created with Certent Disclosure Management 6.31.0.1" 和其他程序,我想这可能是编码的原因。尽管如此,Word 还是能够打开这些文件,所以我想它一定有一个已知的密钥。这是示例编码数据:
M1G2RBE@MN)T='1,SC4,]%$$Q71T3<XU#[AHMB9@*E1=E_U5CKG&(77/*(LY9
ME$N9MY/U9DC,- ZY:4Z0EWF95RMQY#J!ZIB8:9RWF;\"S+1%Z*;VZPV#(MO
MUCHFYAJ'V#6O8*[R9L<VI8[I8KYQB7WSC#DMFGR[E6+;7=2R)N)1QXQ(K
MYQDS$>UJ65%MV4+(KBRHJ3HFIAR76#G/F$%=*9FOU*DM-6TSTC$Q\[C$YC$/
和 a sample file 来自我下载的 13 000 个。
下面我插入了我用来提取文本的 BeautifulSoup。它完成了它的工作,但我需要找到这个编码字符串的线索并以某种方式在下面的 Python 代码中对其进行解码。
from bs4 import BeautifulSoup
with open("98752-TOROTEL INC-10-K-2019-07-23", "r") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'html.parser')
print(soup.getText())
with open("extracted_test.txt", "w", encoding="utf-8") as f:
f.write(soup.getText())
f.close()
我想要实现的是解码文件末尾的这个虚拟字符串。
好吧,这会有点混乱,但会让你足够接近你正在寻找的东西,而无需使用正则表达式(这在 html 中是出了名的问题)。您将面临的根本问题是 EDGAR 文件的格式非常不一致,因此适用于一个 10Q(或 10K 或 8K)文件的文件可能不适用于类似的文件(即使来自同一文件...)例如,单词 'item' 可能以小写或大写(或混合形式)出现,因此使用 string.lower()
方法等。所以在任何情况下都会进行一些清理。
话虽如此,下面的代码应该让您从两个文件(包括具有 none 的文件)中获取风险因素部分:
url = [one of these two]
from bs4 import BeautifulSoup as bs
response = requests.get(url)
soup = bs(response.content, 'html.parser')
risks = soup.find_all('a')
for risk in risks:
if 'item' in str(risk.attrs).lower() and '1a' in str(risk.attrs).lower():
for i in risk.findAllNext():
if 'item' in str(i.attrs).lower():
break
else:
print(i.text.strip())
祝你项目顺利!