1

stackoverflowコミュニティからの多大な支援を受けて、私はPythonについて多くのことを学び、特にBeautifulSoupでスクレイピングを行っています。これを実行する方法を学ぶために使用しているのと同じサンプルページを再度参照しています。

私は次のコードを持っています:

from bs4 import BeautifulSoup
import re

f = open('webpage.txt', 'r')
g = f.read()
soup = BeautifulSoup(g)

for heading in soup.find_all("td", class_="paraheading"):
    key = " ".join(heading.text.split()).rstrip(":")
    if key in columns:
        print key
        next_td = heading.find_next_sibling("td", class_="bodytext")
        value = " ".join(next_td.text.split())
        print value
    if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        print ic_next_td

このページから:

http://www.aidn.org.au/Industry-ViewCompany.asp?CID=3113

webpage.txtとして保存すると、次の結果が得られます。

ACN
007 350 807
ABN
71 007 350 807
Annual Turnover
$5M - $10M
Number of Employees
6-10
QA
ISO9001-2008, AS9120B,
Export Percentage
5 %
Industry Categories
<td class="bodytext">Aerospace<br/>Land (Vehicles, etc)<br/>Logistics<br/>Marine<br/>Procurement<br/></td>
Company Email
lisa@aerospacematerials.com.au
Company Website
http://www.aerospacematerials.com.au
Office
2/6 Ovata Drive Tullamarine VIC 3043
Post
PO Box 188 TullamarineVIC 3043
Phone
+61.3. 9464 4455
Fax
+61.3. 9464 4422

ここまでは順調ですね。これをCSVなどに書き込むことを検討しますが、今のところ、含まれているデータ<td class="bodytext">Aerospace<br/>Land (Vehicles, etc)<br/>Logistics<br/>Marine<br/>Procurement<br/></td>を別々の行に分割する方法を考えていますか?

このような:

Industry Categories
Aerospace
Land (Vehicles, etc)
Logistics
Marine
Procurement

私は次のような正規表現を少し試しました:

if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        value = re.findall('\>(.*?)\<', ic_next_td)
        print value[0]

しかし、私はエロアを取得しますTypeError: expected string or buffer。私もfindallか何かを繰り返す必要があると思っています。

この方法は、「航空宇宙」や「ロジスティクス」の代わりに「ロバ」や「ボート」など、同じ形式の他のバリエーションを処理するのに十分一般的である必要があります(私がいるシナリオでは、必ずしもすべての可能性を前もって知っているとは限りません)について考える)。

brタグとBeautifulsoup、または正規表現を使用してこれを引き出す方法はありますか?

申し訳ありませんが、これは少し長いです。いつものように、提案されたコードの最適化にも非常に満足しているので、Pythonスクリプトを正しく構築するための最良の方法を学び続けることができます。

ありがとうございました!

アップデート

このコードは機能しました:

for heading in soup.find_all("td", class_="paraheading"):
    key = " ".join(heading.text.split()).rstrip(":")
    if key in columns:
        print key
        next_td = heading.find_next_sibling("td", class_="bodytext")
        value = " ".join(next_td.text.split())
        print value
    if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        for value in ic_next_td.strings:
                print value

このコードはインデントエラーを生成しました:

for heading in soup.find_all("td", class_="paraheading"):
    key = " ".join(heading.text.split()).rstrip(":")
    if key in columns:
        print key
        next_td = heading.find_next_sibling("td", class_="bodytext")
        value = " ".join(next_td.text.split())
        print value
    if key == "Industry Categories":
        print key
        ic_next_td = heading.find_next_sibling("td", class_="bodytext")
        for value in ic_next_td.strings:
            print value

print value動作中のコードでは、一見二重のインデントに注意してください。次のレベルのインデントは、後の単一のインデントになると私には思えましたfor value in ic_next_td.strings:か?

4

1 に答える 1

3

ic_next_tdもう少し内容を解析する必要があります。幸い、元のページでは<br/>タグを使用して、テキストを区切る場所を提供しています。ここで正規表現を気にしないでください。BeautifulSoupには優れたツールがあります。

for value in ic_next_td.strings:
    print value

結果は次のようになります。

Aerospace
Land (Vehicles, etc)
Logistics
Marine
Procurement

イテレータlist()を呼び出すことにより、これらすべてをリストに格納できます。.strings

values = list(ic_next_td.strings)
于 2012-11-19T11:49:37.357 に答える