3

私は Web スクレイピングと python (およびそのプログラミング) について学ぼうとしていますが、多くの可能性を提供すると思われる BeautifulSoup ライブラリを見つけました。

このページから適切な情報を引き出す最善の方法を見つけようとしています。

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

これについてもっと詳しく説明できますが、基本的には会社名、それに関する説明、連絡先の詳細、さまざまな会社の詳細/統計などです

この段階では、このデータをきれいに分離してスクレイピングする方法を検討し、後ですべてを CSV などに入れることを検討しています。

BS を使用してさまざまなテーブル データを取得する方法がわかりません。多くの tr タグと td タグがあり、一意のものに固定する方法がわかりません。

私が思いついた最高のものは、最初に次のコードです。

from bs4 import BeautifulSoup
import urllib2

html = urllib2.urlopen("http://www.aidn.org.au/Industry-ViewCompany.asp?CID=3113")
soup = BeautifulSoup(html)
soupie = soup.prettify()
print soupie

そこから正規表現などを使用して、クリーンアップされたテキストからデータを取得します。

しかし、BS ツリーを使用してこれを行うためのより良い方法があるに違いありません。それとも、このサイトは、BS がそれ以上のヘルプを提供しないようにフォーマットされていますか?

それは大きな質問であり、学びたいので完全な解決策を探しているわけではありませんが、私を道に導くためのコードスニペットは大歓迎です。

アップデート

以下の@ZeroPiraeusのおかげで、テーブルを解析する方法を理解し始めています。彼のコードからの出力は次のとおりです。

=== Personnel ===
bodytext    Ms Gail Morgan CEO
bodytext    Phone: +61.3. 9464 4455 Fax: +61.3. 9464 4422
bodytext    Lisa Mayoh Sales Manager
bodytext    Phone: +61.3. 9464 4455 Fax: +61.3. 9464 4422 Email: bob@aerospacematerials.com.au

=== Company Details ===
bodytext    ACN: 007 350 807 ABN: 71 007 350 807 Australian Owned Annual Turnover: $5M - $10M Number of Employees: 6-10 QA: ISO9001-2008, AS9120B, Export Percentage: 5 % Industry Categories: AerospaceLand (Vehicles, etc)LogisticsMarineProcurement 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
paraheading ACN:
bodytext    007 350 807
paraheading ABN:
bodytext    71 007 350 807
paraheading 
bodytext    Australian Owned
paraheading Annual Turnover:
bodytext    $5M - $10M
paraheading Number of Employees:
bodytext    6-10
paraheading QA:
bodytext    ISO9001-2008, AS9120B,
paraheading Export Percentage:
bodytext    5 %
paraheading Industry Categories:
bodytext    AerospaceLand (Vehicles, etc)LogisticsMarineProcurement
paraheading Company Email:
bodytext    lisa@aerospacematerials.com.au
paraheading Company Website:
bodytext    http://www.aerospacematerials.com.au
paraheading Office:
bodytext    2/6 Ovata Drive Tullamarine VIC 3043
paraheading Post:
bodytext    PO Box 188 TullamarineVIC 3043
paraheading Phone:
bodytext    +61.3. 9464 4455
paraheading Fax:
bodytext    +61.3. 9464 4422

次の質問は、このデータをスプレッドシートにインポートするのに適した CSV に入れる最良の方法は何ですか? たとえば、「ABN」「ACN」「会社のウェブサイト」などを列見出しとして使用し、対応するデータを行情報として使用します。

助けてくれてありがとう。

4

2 に答える 2

3

コードは、必要なものとその保存方法によって異なりますが、このスニペットは、ページから関連情報を取得する方法を理解するのに役立ちます。

import requests

from bs4 import BeautifulSoup

url = "http://www.aidn.org.au/Industry-ViewCompany.asp?CID=3113"
html = requests.get(url).text
soup = BeautifulSoup(html)

for feature_heading in soup.find_all("td", {"class": "Feature-Heading"}):
    print "\n=== %s ===" % feature_heading.text
    details = feature_heading.find_next_sibling("td")
    for item in details.find_all("td", {"class": ["bodytext", "paraheading"]}):
        print("\t".join([item["class"][0], " ".join(item.text.split())]))

requestsより快適なライブラリを見つけましたurllib2が、もちろんそれはあなた次第です。

編集:

フォローアップの質問への回答として、スクレイピングされたデータから CSV ファイルを作成するために使用できるものを次に示します。

import csv
import requests

from bs4 import BeautifulSoup

columns = ["ACN", "ABN", "Annual Turnover", "QA"]
urls = ["http://www.aidn.org.au/Industry-ViewCompany.asp?CID=3113", ] # ... etc.

with open("data.csv", "w") as csv_file:
    writer = csv.DictWriter(csv_file, columns)
    writer.writeheader()
    for url in urls:
        soup = BeautifulSoup(requests.get(url).text)
        row = {}
        for heading in soup.find_all("td", {"class": "paraheading"}):
            key = " ".join(heading.text.split()).rstrip(":")
            if key in columns:
                next_td = heading.find_next_sibling("td", {"class": "bodytext"})
                value = " ".join(next_td.text.split())
                row[key] = value
        writer.writerow(row)
于 2012-11-12T19:32:31.953 に答える
0

私は前に一度この道を進んでいました。私が使用していたhtmlページは、常にテーブルと同じ形式であり、会社の内部にありました。ページを変更するとプログラミングが中断する可能性が高いことをお客様が知っていることを確認しました。その規定により、trとtdのリストからのインデックス値によってすべてがどこにあるのかを確実にすることができました。XMLデータを提供できない、または提供できないという理想的な状況からはほど遠いものでしたが、ほぼ1年前から完全に機能しています。誰かがもっと良い答えを知っているなら、私もそれを知りたいです。それは私がBeautifulSoupを使用した最初で唯一の時であり、それ以来それを必要としませんでしたが、それは非常にうまく機能します。

于 2012-11-12T17:56:59.660 に答える