Python 当父级位于隐含命名空间中时,BeautifulSoup会删除子级

Python 当父级位于隐含命名空间中时,BeautifulSoup会删除子级,python,firefox,selenium,beautifulsoup,Python,Firefox,Selenium,Beautifulsoup,我正在使用selenium和BeautifulSoup为Nordstrom的网站构建一个屏幕刮板。该网站实际上并没有在名称空间中包含所有标记,但Firefox webdriver创建了一个标记以避免歧义(具体来说,该网站有一个标记,似乎会混淆驱动程序)。 因此,所有内容都放在名称空间a0中。但是,当调用find()时,Beautiful Soup仅返回父元素和(有时)一级子元素。 以html为例: 但是,这将返回None。我已经浏览了soup.prettify(),可以肯定地说a0:img在a

我正在使用selenium和BeautifulSoup为Nordstrom的网站构建一个屏幕刮板。该网站实际上并没有在名称空间中包含所有标记,但Firefox webdriver创建了一个标记以避免歧义(具体来说,该网站有一个
标记,似乎会混淆驱动程序)。
因此,所有内容都放在名称空间
a0
中。但是,当调用
find()
时,Beautiful Soup仅返回父元素和(有时)一级子元素。
以html为例:

但是,这将返回
None
。我已经浏览了
soup.prettify()
,可以肯定地说
a0:img
a0:div
中。这是一个预期的特性(在这种情况下,我需要找到一种新的方法)还是一个bug(在这种情况下,我需要一个解决方法)

编辑

为避免混淆,以下示例演示了整个工作流:

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')
上述代码将无法找到的图像设置为无,我认为这是不正确的。我希望这能澄清问题。

这对我来说很有效

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')

我承认这不是一个理想的解决办法。如果我找到一个更优雅的解决方案,我会继续查找并更新我的答案。

注意
soup.find('a0:div',{class':'division')
返回
div,但没有图像(或任何其他二级子级)。您能提供一个特定的url吗?例如,特定url不包含
。事实上,对页面源代码的简单搜索根本找不到字符串“division”的实例。您可能应该假设我给出了一个类似情况的示例。试试这个:
soup.find('a0:div',{'class':'fashion-item')).find('a0:img')
注意,这必须在Selenium中完成才能正确解析javascript.urllib以与Selenium.webdriver.Firefox不同的方式解析html,我在这里使用的是Selenium.webdriver.Firefox。我在问题中提到我使用了selenium,我武断地猜测a0名称空间与firebug有关。无论采用哪种方式,通过字符串操作手动删除名称空间似乎都是可行的(我只是将“a0:”替换为“无处不在”,忽略了可能对内容产生的任何影响)。
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
source = browser.page_source.replace('a0:div','div')
soup = BeautifulSoup(source)

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