2016-07-30 3 views
0

を選択されていない。美しいスープは、これは私はすべての要素を反復処理するために使用しているコードである任意の要素

soup_top = bs4.BeautifulSoup(r_top.text, 'html.parser') 

selector = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 

for link in soup_top.select(selector): 
    print(link) 

同じセレクタはJavaScriptで使用される57の長さを与える:

document.querySelectorAll("#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a").length; 

私はおそらく、私は正しくWebページの内容を取得していないと思った。私はWebページのローカルコピーを保存しましたが、Beautiful Soupのセレクタは何も選択しませんでした。ここで何が起こっているのですか?

これはwebsiteです。コードを使用しています。

+0

HTMLを共有できますか?それがなければ、何が起こっているのかを見るのは難しいでしょう。 –

+0

既に言及したように、私たちはhtmlを見ずには分かりません –

+0

@Kristof私はウェブサイトへのリンクを追加しました。私は掻き取ろうとしています。 –

答えて

0

これはparser(つまりhtml.parser)が原因であるようです。私はパーサとしてlxmlと同じことをしようとした場合:

from bs4 import BeautifulSoup 
import requests 

url = 'http://www.swapnilpatni.com/law_charts_final.php' 
r = requests.get(url) 
r.raise_for_status() 

soup = BeautifulSoup(r.text, 'lxml') 

css_select = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 
links = soup.select(css_select) 
print('{} link(s) found'.format(len(links))) 

>> 1 link(s) found 

for link in links: 
    print(link['href']) 

>> spadmin/doc/Company Law amendment 1.1.png 

html.parser#ContentPlaceHolder1_gvDisplay table trまでの結果を返しますが、その場合でも、それだけで最初trを返します。

W3 Markup Validation Serviceを通じてURLを実行している場合、これが返されるエラーです。

ライン1212上で、それは私がUTFとして解釈できない1バイト以上が含まれているため申し訳ありませんが、私はこの文書を検証することができません-8(つまり、見つかったバイトは、指定された文字エンコーディングの有効な値ではありません)。ファイルの内容と文字コードの両方を確認してください。 エラー:lxmlがよりフォールトトレラントである一方、UTF8「\ XA0は」、Unicodeの

それはhtml.parserが同様にこの上で窒息ている可能性がありますにマップされません。

+0

ありがとうkristof :) 一般に、 'html.parser'の代わりに' lxml'を使用する方が良いですか? –

+0

ドキュメントの比較表に見られるように、 'lxml'は高速です(C言語で書かれているように)とても寛大です。個人的には、私は常に 'lxml'を使いますが、それはあなたのプロジェクトに外部依存を追加するという欠点があります。 –

+0

私は「あなたが要求した機能を持つツリービルダを見つけることができませんでした:lxml'」というエラーを受け取りました。私はこれがあなたが外的依存関係を意味するものだと思います。どのように解決するのですか? –

関連する問題