2012-01-08 17 views
-1

私はhtmlファイルを解析していますが、「Smaller Reporting Company」と書かれているファイルの部分を見つけてその隣に「X」または「チェックボックス」があります。このチェックボックスは通常、WingdingsフォントまたはASCIIコードで行われます。下のHTMLには、それの横に羽の中にþがあることがわかります。Python BeautifulSoup特定のテキストを解析しています

テキストの正規表現検索の結果を表示するのに問題はありませんが、次のステップに進んでチェックボックスを検索するのに問題があります。

私はこれを使用して、すべて同じフォーマットに従わない多くの異なるHTMLファイルを解析しますが、大部分はこの例のようにテーブルとASCIIテキストを使用します。ここで

は、HTMLコードである:ここで

<HTML> 
<HEAD><TITLE></TITLE></HEAD> 
<BODY> 
<DIV align="left">Indicate by check mark whether the registrant is a large accelerated filer, an accelerated filer, a non-accelerated filer, or a smaller reporting company. See the definitions of &#147;large accelerated filer,&#148; &#147;accelerated filer&#148; and &#147;smaller reporting company&#148;. (Check one): 
</DIV> 

<DIV align="center"> 
<TABLE style="font-size: 10pt" cellspacing="0" border="0" cellpadding="0" width="100%"> 
<!-- Begin Table Head --> 
<TR valign="bottom"> 
    <TD width="22%">&nbsp;</TD> 
    <TD width="3%">&nbsp;</TD> 
    <TD width="22%">&nbsp;</TD> 
    <TD width="3%">&nbsp;</TD> 
    <TD width="22%">&nbsp;</TD> 
    <TD width="3%">&nbsp;</TD> 
    <TD width="22%">&nbsp;</TD> 
</TR> 
<TR></TR> 
<!-- End Table Head --> 
<!-- Begin Table Body --> 
<TR valign="bottom"> 
    <TD align="center" valign="top"><FONT style="white-space: nowrap"> Large accelerated filer <FONT style="font-family: Wingdings">&#111;</FONT></FONT> 
    </TD> 
    <TD>&nbsp;</TD> 
    <TD align="center" valign="top"><FONT style="white-space: nowrap">Accelerated filer <FONT style="font-family: Wingdings">&#111;</FONT></FONT> 
    </TD> 
    <TD>&nbsp;</TD> 
    <TD align="center" valign="top"><FONT style="white-space: nowrap"> Non-accelerated filer <FONT style="font-family: Wingdings">&#111;</FONT> </FONT> 
    <FONT style="white-space: nowrap">(Do not check if a smaller reporting company)</FONT> 
    </TD> 
    <TD>&nbsp;</TD> 
    <TD align="center" valign="top"><FONT style="white-space: nowrap"> Smaller reporting company <FONT style="font-family: Wingdings">&#254;</FONT></FONT></TD> 
</TR> 
<!-- End Table Body --> 
</TABLE> 
</DIV></BODY></HTML> 

は私のPythonコードは次のとおりです。

import os, sys, string, re 
from BeautifulSoup import BeautifulSoup 

rawDataFile = "testfile1.html" 
f = open(rawDataFile) 
soup = BeautifulSoup(f) 
f.close() 

search = soup.findAll(text=re.compile('[sS]maller.*[rR]eporting.*[cC]ompany')) 
print search 

質問:私が最初に依存している2番目の検索を持っているために、これを設定することができどのよう サーチ?だから、私が「小規模の報告会社」を見つけると、次の数行を検索してASCIIコードがあるかどうかを調べることができます。私はスープ文書を見てきました。私はfindとfindNextをしようとしましたが、動作させることができませんでした。

+0

を、私はあなたが修正されている必要があることを賭ける_ X 『やチェックボックスの横、「持っています』それに "_から_"には "X" ** ON **チェックボックスがあります。これは私を困惑させ、あなたの質問に対する私の理解を悩ませました。あなたはよく理解されることを気にしない? – eyquem

+0

_ "下のHTMLでは、その横にwingdingsがあることがわかります。どこ? – eyquem

+1

「ASCIIコード」とは何ですか?それはoとþですか? – eyquem

答えて

0

ウィング文字の位置が変わらないことがわかっている場合は、.nextを使用できます。

>>> nodes = soup.findAll(text=re.compile('[sS]maller.*[rR]eporting.*[cC]ompany')) 
>>> nodes[-1].next.next # last item in list is the only good one... kinda crap 
u'&#254;' 

またはあなたが上がることができ、その後、findそこから:

>>> nodes[-1].parent.find('font',style="font-family: Wingdings").next 
u'&#254;' 

それとも、それを他の方法でラウンド行うことができます:

>>> soup.findAll(text='&#254;')[0].previous.previous 
u' Smaller reporting company ' 

これあなたがwingdingを知っていることを前提としあなたが探しているカハルター。

最後の戦略は、あなたの正規表現がキャッチしている他のクラップスを除外するという追加ボーナスがあります。これはあなたが本当に望んでいないと思います。適切なリストでしか作業していないことを知っているので、あなたは好きなようにifを閲覧することができます。

0

構造を反復して内側のタグ内の値をチェックしたり、外側のタグの値をチェックしたりすることができます。私はそれを行う方法を手で覚えていないと私はこれのためにlxmlを使用して終わったが、私はbsoupがこれを行うことができると思う。

bsoupを実行できない場合は、lxmlをチェックしてください。それはあなたがやっていることに応じて潜在的に速いです。また、bsoupをlxmlで使用するためのフックもあります。

0

lxmlには、許容されるHTMLパーサーがあります。 bsoup(これは著者によって廃止されました)が不要で、HTMLを解析するための正規表現を避けるべきです。ここで

は、あなたが探しているもので、最初のラフカットです:

guff = """\ 
<HTML> 
<HEAD><TITLE></TITLE></HEAD> 
[snip] 
</DIV></BODY></HTML> 
""" 
from lxml.html import fromstring 
doc = fromstring(guff) 
for td_el in doc.iter('td'): 
    font_els = list(td_el.iter('font')) 
    if not font_els: continue 
    print 
    for el in font_els: 
     print (el.text, el.attrib) 

これが生成します。

(' Large accelerated filer ', {'style': 'white-space: nowrap'}) 
('o', {'style': 'font-family: Wingdings'}) 

('Accelerated filer ', {'style': 'white-space: nowrap'}) 
('o', {'style': 'font-family: Wingdings'}) 

(' Non-accelerated filer ', {'style': 'white-space: nowrap'}) 
('o', {'style': 'font-family: Wingdings'}) 
('(Do not check if a smaller reporting company)', {'style': 'white-space: nowrap 
'}) 

(' Smaller reporting company ', {'style': 'white-space: nowrap'}) 
(u'\xfe', {'style': 'font-family: Wingdings'}) 
+0

lxmlの問題はlibxmlへの依存です。あなたはJythonではまったく使用できません。 BSの美しさは、それが純粋なPythonの単なるファイルの1つであるということです。 –

関連する問題