0

いくつかの技術計算のために、物理特性を設定する必要があることがよくあります。このようなデータを手で入力するのは便利ではありません。Pythonスクリプトを使用して、公開Webページ(Wikipediaなど)からそのようなデータを取得したいと思います。

私はいくつかの方法を試していました:

  • lxml.etreeのような html パーサーを使用する(私は経験がありません - チュートリアルに従おうとしていただけです)
  • pandas wikitable インポート( --,,-- )を使用する
  • urllib2を使用して html ソースをダウンロードし、正規表現でキーワードを検索します

私にできること:

さまざまな情報源に適用できる普遍的なソリューションは見つかりませんでした。実際に動作する私が作成した唯一のスクリプトは、単純な urllib2 と正規表現のみを使用します。プレーンな HTML であるこのページから要素の物理プロパティを取得できます。

私ができないこと:

このようなより洗練された Web ページでは、これを行うことができません。urllib2 で取得したこのページの HTML コードには、探しているキーワードとデータ (曲げ強度、弾性係数など) が含まれていませんか? 実際、ウィキページはまったく含まれていないようです! そんなことがあるものか?これらの wiki テーブルは何らかの形で動的にリンクされていますか? urllib でテーブルの競合を取得するにはどうすればよいですか? なぜ urllib2 はこのデータを取得せず、私の Web ブラウザーは取得するのですか?

Webプログラミングの経験はありません。無料の公開オンライン情報源から機械可読データを取得するのがなぜそれほど難しいのか、私には理解できません。

4

2 に答える 2

1

私はあなたが何を意味するのか理解できません

ウィキページがまったく含まれていないようです

私はこれを比較的迅速に取得しました:

import httplib
import re

hostu = 'www.substech.com'
timeout = 7
hypr = httplib.HTTPConnection(host=hostu,timeout = timeout)

rekete_page = ('/dokuwiki/doku.php?id='
               'thermoplastic_acrylonitrile-butadiene-styrene_abs')

hypr.request('GET',rekete_page)
x = hypr.getresponse().read()
hypr.close()

#print '\n'.join('%d %r' % (i,line) for i,line in enumerate(x.splitlines(1)))

r = re.compile('\t<tr>\n.+?\t</tr>\n',re.DOTALL)

r2 = re.compile('<th[^>]*>(.*?)</th>')
r3 = re.compile('<td[^>]*>(.*?)</td>')

for y in r.findall(x):
    print
    #print repr(y)
    print map(str.strip,r2.findall(y))
    print map(str.strip,r3.findall(y))

結果

[]
['<strong>Thermoplastic</strong>']

[]
['<strong>Acrylonitrile</strong><strong>-Butadiene-Styrene (ABS)</strong>']

[]
['<strong>Property</strong>', '<strong>Value in metric unit</strong>', '<strong>Value in </strong><strong>US</strong><strong> unit</strong>']

['Density']
['1.05 *10\xc2\xb3', 'kg/m\xc2\xb3', '65.5', 'lb/ft\xc2\xb3']

['Modulus of elasticity']
['2.45', 'GPa', '350', 'ksi']

['Tensile strength']
['45', 'MPa', '6500', 'psi']

['Elongation']
['33', '%', '33', '%']

['Flexural strength']
['70', 'MPa', '10000', 'psi']

['Thermal expansion (20 \xc2\xbaC)']
['90*10<sup>-6</sup>', '\xc2\xbaC\xcb\x89\xc2\xb9', '50*10<sup>-6</sup>', 'in/(in* \xc2\xbaF)']

['Thermal conductivity']
['0.25', 'W/(m*K)', '1.73', 'BTU*in/(hr*ft\xc2\xb2*\xc2\xbaF)']

['Glass transition temperature']
['100', '\xc2\xbaC', '212', '\xc2\xbaF']

['Maximum work temperature']
['70', '\xc2\xbaC', '158', '\xc2\xbaF']

['Electric resistivity']
['10<sup>8</sup>', 'Ohm*m', '10<sup>10</sup>', 'Ohm*cm']

['Dielectric constant']
['2.4', '-', '2.4', '-']
于 2013-09-07T21:40:18.770 に答える
1

Webスクレイピングは難しい。それはロケット科学だからではなく、単に面倒だからです。現時点では、サイトの構造が変わらない限り、さまざまなサイト用に手作りのスクレイパーを使用する必要があります。

Web 情報抽出には、より自動化されたアプローチがあります。たとえば、このペーパーで説明されているように: Web 上のリストからのリレーショナル テーブルの収集ですが、これはまだ主流ではありません。

多くの Web ページには、「リスト」の形式で構造化されたデータが含まれています。このようなリストの多くは、複数列のテーブルにさらに分割でき、意味的に意味のあるタスクで使用できます。ただし、そのようなリストからリレーショナル テーブルを収集するのは困難な作業になる可能性があります。リストは手動で生成されるため、適切に定義されたテンプレートを用意する必要はありません。デリミタが矛盾しており (存在する場合)、情報が欠落していることがよくあります。


ただし、(HTML) コンテンツにより迅速にアクセスするためのツールが多数あります。たとえば、BeautifulSoup :

Beautiful Soup は、スクリーン スクレイピングのような迅速なターンアラウンド プロジェクト用に設計された Python ライブラリです。

>>> from BeautifulSoup import BeautifulSoup as Soup
>>> import urllib
>>> page = urllib.urlopen("http://www.substech.com/dokuwiki/doku.php?"
               "id=thermoplastic_acrylonitrile-butadiene-styrene_abs").read()
>>> soup = Soup(page) # the HTML gets parsed here
>>> soup.findAll('table') 

出力例: https://friendpaste.com/DnWDviSiHIYQEBduTqkWd . 詳細なドキュメントは、http ://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree にあります。

より大きなページセットからデータを抽出したい場合は、scrapyを見てください。

于 2013-09-07T20:26:01.667 に答える