1

我正在为使用 BeautifulSoup4 的几家公司从几份包含董事签名的文件中提取一个特定的表格。我的程序在包含表格的部分上方找到一个标题,然后从该位置向下计数两个表格以找到正确的表格(文件是政府文件意味着该格式几乎在所有情况下都适用)。目前,这就是我的做法:

soup=BeautifulSoup(theDocument)

try:
   tables = soup.find(text=re.compile("Pursuant to the requirements of Section 13")).findNext('table').findNext('table').strings
except AttributeError as e:
   #deal with error, output failed URL to file

使用此代码,我可以找到大约 70% 的搜索表,但有些只是抛出错误。例如,此文档是找不到表的文档之一(您可以通过对 re.compile 字符串执行 CTRL+F 来找到文档中的部分),但是此文档来自同一家公司,看起来像相同的 HTML 格式会产生积极的结果。

有任何想法吗?

编辑:   可能是一个问题,但还有另一个问题。将搜索字符串缩短为不包含   仍然会导致失败。

EDIT2:似乎有时会发生潜在的错误。我尝试打印出 HTML 数据变量并得到以下信息:

<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http&#58;&#47;&#47;www&#46;sec&#46;gov&#47;Archives&#47;edgar&#47;data&#47;1800&#47;000110465907013496&#47;a07&#45;1583&#95;110k&#46;htm" on this server.<P>
Reference&#32;&#35;18&#46;ee9a1645&#46;1466687980&#46;5cc0b4f
</BODY>
</HTML>

有什么办法可以解决这个问题,同时仍然删除  ?

编辑2:下面的答案确实解决了我遇到的问题,所以我将其标记为已回答。也就是说,字符串中存在随机换行符的另一个潜在问题,因此我修改了我的正则表达式以检查所有单词之间的 '\s+' 而不仅仅是空格。如果遇到此类问题,请务必检查此错误的 HTML 代码。

4

1 回答 1

2

问题在于和&nbsp;之间:Section13

<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pursuant to the requirements of Section&nbsp;13 or 15(d) of the Securities Exchange Act of 1934, Abbott Laboratories has duly caused
this report to be signed on its behalf by the undersigned, thereunto duly authorized. </font>

在检查属性时,我会使用搜索功能用常规空格替换:&nbsp;.text

import requests
from bs4 import BeautifulSoup


# url = "https://www.sec.gov/Archives/edgar/data/1800/000110465907013496/a07-1583_110k.htm"
url = "https://www.sec.gov/Archives/edgar/data/1800/000104746916010246/a2227279z10-k.htm"
response = requests.get(url, headers={
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
})

data = response.text
soup = BeautifulSoup(data, "lxml")

text_to_search = "Pursuant to the requirements of Section 13"
p = soup.find(lambda elm: elm.name == "p" and elm.text and text_to_search in elm.text.replace(u'\xa0', ' '))
tables = p.findNext('table').findNext('table').strings
于 2016-06-22T18:17:41.300 回答