1

BeautifulSoup4を使用しているいくつかの企業のために、取締役の署名を保持するいくつかの文書から特定のテーブルを抽出することに取り組んでいます。私のプログラムは、テーブルを保持するセクションの上にある見出しを見つけ、その場所から 2 つのテーブルを数えて正しいテーブルを見つけます (文書が政府文書であるということは、ほとんどすべての場合にフォーマットが当てはまることを意味します)。現在、これは私がやっている方法です:

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% でテーブルを見つけることができますが、エラーをスローするものもあります。たとえば、このドキュメントは表が見つからないものの 1 つですが (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>

  を削除しながら、この問題を回避する方法はありますか?

EDIT 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 に答える