BS4抓取具有异常属性的标记内容

时间:2015-02-03 07:54:10

标签: python python-2.7 beautifulsoup

我正在使用BS4抓取一个网站(我们有权抓取但无法控制html)并且他们稍微改变了格式。这种变化意味着我无法找到一种方法来抓住一个小段。

这是html

<p class="icons"> 
<span data-caption=" Bed"> 8</span>            
<span data-caption=" Bath">4</span>            
<span data-caption=" Car">4</span>            
<span data-caption="">1090m&sup2;        
</p>        

我正在尝试使用

获取床的数量
bed = soup.find("span",{"data-caption":" Bed"})

然后使用

进行清理
bed = bed.replace(" ","")

但每次床都设置为无。有关如何抓住它的任何见解?

2 个答案:

答案 0 :(得分:1)

使用strip函数去除所有前导或尾随空格。 .text可帮助您获取该特定代码的内容。

>>> s = """<p class="icons"> 
<span data-caption=" Bed"> 8</span>            
<span data-caption=" Bath">4</span>            
<span data-caption=" Car">4</span>            
<span data-caption="">1090m&sup2;        
</p> """
>>> soup = BeautifulSoup(s)
>>> soup.find("span",{"data-caption":" Bed"}).text.strip()
'8'

答案 1 :(得分:1)

您正尝试在元素上使用replace方法

>>> soup.find("span",{"data-caption":" Bed"})
<span data-caption=" Bed"> 8</span>
>>> soup.find("span",{"data-caption":" Bed"}).replace(' ', '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

BeautifulSoup允许您仅按名称查找元素作为属性。 BeautifulSoup无法理解的任何属性都会被该名称转换为元素的搜索

因为您在元素上使用了名称.replace,所以BeautifulSoup正在尝试查找<replace>元素。没有这样的元素,因此返回None

>>> soup.find("span",{"data-caption":" Bed"}).replace is None
True

您需要做的就是使用element.get_text() method

>>> soup.find("span",{"data-caption":" Bed"}).get_text()
u' 8'

您可以为其指定一个strip关键字参数,将其设置为True,以便为您删除文本元素(从开头和结尾删除空格):

>>> soup.find("span",{"data-caption":" Bed"}).get_text(strip=True)
u'8'