2017-01-11 5 views
0

私はpython 2.7.12のリクエストとBeautifulSoupモジュールを使用してこのウェブスクレイピング演習を行ってきました。私の問題は、スープオブジェクトがIDに基づいて特定のtrを返すように見えないことと、idを持ついくつかの他のhtml要素が、以下のprintステートメントのものを含めてランダムに選んだことです。それがなぜ機能していないのでしょうか?どんな助けでも大歓迎です。BeautifulSoupが見つからない

import requests 
from bs4 import BeautifulSoup as bs 

head= { 
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36', 
'Content-Type': 'text/html',} 

r = requests.get('http://www.iii.co.uk/investment/detail?code=cotn:LSE:SEE&display=discussion', headers=head) 

r_text = r.text 
soup = bs(r_text, "html.parser") 

print soup.find("tr",id="disc1-12056888") 
print soup.find('table', id='discussion-list') 
+0

別のライブラリの代わりにBSを使用する特定の理由はありますか?簡単なことのために私は 'PyQuery'を使いたいし、DOMセレクタを使って情報を抽出します。 –

+0

r_textを共有できますか? – Shijo

+0

@RafaelAguilar nope。単にコメントのためにサイトをこすりたがっていました。そのためにPyQueryを提案しますか? – AndrewF

答えて

1

私はhtml.parserを信じますlxmlまたはhtml5lib

soup = bs(r_text, "lxml") 
を使用し、python2不安定です

この引用はDocumentからである:

することができますならば、私はあなたがスピードのためにlxmlのをインストールして使用をお勧めします。 Python 2のバージョン2.7.3より前のバージョン、またはPython の3.2.2より前のバージョンを使用している場合は、lxmlまたは をインストールすることが不可欠です。html5lib- Pythonの組み込みHTMLパーサーは、古いのは非常に良い バージョン。

+0

ありがとうございます!私はこのための理由を長い間見つけようと苦労していました。私の将来の参照のために、私が使用しているパッケージとバージョンのコンボにバグがあるかどうかを調べる特定の場所はありますか? – AndrewF

+0

@AndrewF私はこのバグを知っている理由は、スタックのオーバーフローでこの質問に多く答えている理由です。可能であれば、lxmlをインストールして使用することをお勧めします。 2.7より前のバージョンのPython 2を使用している場合。3、または3.2.2より前のバージョンのPython 3では、lxmlまたはhtml5libをインストールすることが不可欠です。Pythonの組み込みHTMLパーサは古いバージョンではあまりよくありません。 –

1

@AndrewF:

私はここで、抽出のコメントなどの単純なタスクのためPyQueryを使用するためにあなたをお勧めしたい、それのシンプルさを示すためのスニペットです:

import requests 
import pyquery 

head= { 
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36', 
'Content-Type': 'text/html',} 

r = requests.get('http://www.iii.co.uk/investment/detail?code=cotn:LSE:SEE&display=discussion', headers=head) 

r_text = r.text 
pq = pyquery.PyQuery(r_text) 

for a in pq('tr.comment div'): 
    if a.text.strip(): 
     print(a.text.strip()) 
+0

ありがとう!これは簡単な方法であることが判明しました。 – AndrewF

関連する問題