2016-06-22 5 views
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%のためのテーブルを見つけることだが、いくつかは、単にエラーを投げます。たとえば、this documentはテーブルを見つけられないものの1つです(re.compile文字列のCTRL + Fキーを押して文書内のセクションを見つけることができます)。しかし、同じ会社のthis documentと同じように見えますHTMLフォーマットは肯定的な結果をもたらす。

アイデア?

編集:& nbsp問題が発生する可能性がありますが、もう1つ問題があります。 & nbspを含まないように検索文字列を短くすると、まだエラーが発生します。

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> 

この問題を回避任意の方法を、まだ& NBSPを除去しながら?

編集2:以下の回答は、私が持っていた問題を解決したので、回答としてマークしました。つまり、文字列にランダムな改行があるという根本的な問題がもう一つあったので、スペースの代わりにすべての単語の間で '\ s +'をチェックする正規表現を変更しました。 このような問題が発生した場合は、このエラーのHTMLコードを確認してください。

+2

を別のパーサーを使用してみましたが?例: 'BeautifulSoup(theDocument、 'html.parser')' – Jkdc

+0

@Jkdc答えの1つでは、lxmlをセカンダリパーサーとして使用しようとしました。それは解決されたよりも多くのエラーを引き起こしました:)それは言われている、それは最初の試みがキャッチしない場合を拾うために働くかもしれません。 – Retroflux

+0

@ Jkdcもしあなたがそれに亀裂を入れたいのであれば、問題は発展しました。 – Retroflux

答えて

2

問題がSection13&nbsp;次のとおりです。

<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> 

私は.textプロパティチェックするときsearching functionreplace the &nbsp; with a regular space使用します。

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 
+0

ありがとう、ありがとう修正。いくつかのエラーを解決しましたが、多数の新しいエラーが発生しました。私は間違いなくあなたの考えのいくつかを自分のコードに取り入れようとしています。おそらく3番目のチャンスシステムです。 soup.findの仕組みを説明してもらえますか?私は前にこれらの要素のいくつかを見ていない。 – Retroflux

+0

@Retrofluxさて、この特定の問題を解決したようですが、コードをさらに助けなければならない場合は別の質問をしてください。私が答えで使うトリックは、基本的には、目的の部分文字列があるかどうかを確認する前に、テキスト上で特定の操作(この場合は置換)を行うのに役立つ関数です。 'BeautifulSoup'は、要素の配置に非常に柔軟性があり、それを行うためのあらゆる種類の方法を提供します。希望が役立ちます。 – alecxe

+0

多くのテストの後で、&nbsp文字を含まない単語 "セクション"までしか検索しなくても、このテストで失敗していることに気付きました。これが失敗する別の理由がありますか? – Retroflux

関連する問題