1

セレンとBeautifulSoupを使用して、ノードストロームのWebサイト用のスクリーンスクレーパーを作成しています。Webサイトは実際には名前空間にすべてのタグを持っているわけではありませんが、Firefox Webドライバーはあいまいさを避けるためにタグを作成します(具体的には、サイトには<html xmlns>ドライバーを混乱させるように見えるタグがあります)。
したがって、すべてが名前空間に配置されますa0。ただし、Beautiful Soupは、が呼び出されたときに、親要素と(場合によっては)1レベルの子のみを返しますfind()
このhtmlを例にとってみましょう。

<div class='division'>
   <a href='#'>
      <img />
   </a>
</div>

すべてが暗黙のa0名前空間にあるため、次のようにして画像を取得できます。

soup.find('a0:div',{'class':'division'}).find('a0:img')

ただし、これはを返しますNone。私は目を通しsoup.prettify()、確実にa0:img内にあると言うことができますa0:div。これは意図された機能(この場合、新しい方法を見つける必要があります)ですか、それともバグ(この場合、回避策が必要です)ですか?

編集

混乱を避けるために、これはワークフロー全体を示す例です。

from selenium import webdriver
from BeautifulSoup import BeautifulSoup # Note that this is BeautifulSoup 3
b = webdriver.Firefox()
b.get("http://shop.nordstrom.com/c/womens-skirts")
borscht = BeautifulSoup(b.page_source)
theImageThatCannotBeFound = borscht.find('a0:div',{'class':'fashion-item'}).find('a0:img')

上記のコードはに設定theImageThatCannotBeFoundされていますがNone、これは正しくないと思います。これが明らかになることを願っています。

4

1 に答える 1

2

これは私のために働いた。

import urllib
from BeautifulSoup import BeautifulSoup

url = 'http://shop.nordstrom.com/c/womens-skirts'
fp = urllib.urlopen(url)
soup = BeautifulSoup(fp)

print soup.find('div',{'class':'fashion-item'}).findAll('img') # also tried .find

を除外してみてくださいa0:。それがあなたの問題のようです。

編集:

Seleniumの内外でChromeブラウザとFirefoxブラウザの両方を使用するとxmlns、表示時に空の文字列に設定されます。これが、上記のコードが機能する理由です。どこかのコンポーネントの不一致により、同じ結果が得られず、名前空間を取得しているようですa0:

状況を再現できないため、(非常にハッキーではありますが)見つけることができる唯一の解決策は、名前空間を手動で置き換えることです。

source = browser.page_source.replace('a0:div','div')
soup = BeautifulSoup(source)

print soup.find('div',{'class':'fashion-item'}).find('img')

私はそれが必ずしも理想的な解決策ではないことを認めます。よりエレガントな修正が見つかった場合は、引き続き検索して回答を更新します。

于 2013-01-31T22:45:44.400 に答える