1

我正在使用 selenium 和 BeautifulSoup 为 Nordstrom 的网站构建一个屏幕截图。该网站实际上并没有命名空间中的每个标签,但 Firefox 网络驱动程序会创建一个以避免歧义(具体来说,该网站有一个<html xmlns>标签似乎会混淆驱动程序)。
因此,所有内容都放在了 namespace 中a0find()但是,Beautiful Soup 仅在调用时返回父元素和(有时)一级子元素。
以这个 html 为例:

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

一切都在隐含的a0命名空间中,因此我们可以通过以下方式获取图像:

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

但是,这会返回None。我已经看过并且可以肯定地soup.prettify()说. 这是一个预期的功能(在这种情况下我需要找到一种新的方法)还是一个错误(在这种情况下我需要一个解决方法)?a0:imga0: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')

上面的代码设置theImageThatCannotBeFoundNone,我认为这是不正确的。我希望这可以澄清。

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当我查看它时,它被设置为一个空字符串,这就是上面的代码对我有用的原因。似乎由于某处某些组件的不匹配,我们没有得到相同的结果,而您得到的是 namespace a0:

因为我无法重现这种情况,所以我能找到的唯一解决方案(虽然很hacky)是手动替换命名空间:

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 回答