BeautifulSoup找到功能异常的行为

时间:2014-09-05 22:33:03

标签: python python-2.7 python-3.x beautifulsoup urllib2

import urllib2
from bs4 import BeautifulSoup

url = 'http://www.amazon.com/dp/B00IOXUJRY'

page = BeautifulSoup(urllib2.urlopen(url))

print page
title = page.find(id='productTitle') #.text.replace('\t','').strip()
print repr(title)

如果我尝试获取此prodcutTitle id的文本,则返回None。虽然我打印页面值并检查这是静态文本还是来自javascript / ajax。我已经在这上花了1个小时但却找不到原因。可能是我做了一个我不知道的小傻错?

PS:我还有一个问题。 有一节"产品说明"以下"重要信息"部分。这是javascript生成的内容(我想是这样??)。所以我必须使用selenium / phantomJS类库。有没有办法从beautifulsoup或python的内置库中获取这些内容(因为selenium太慢了) 任何其他图书馆,如机械化或robobrowser等?

1 个答案:

答案 0 :(得分:1)

您遇到了BeautifulSoup使用的differences between parsers

由于您尚未明确指定,BeautifulSoup chooses one automatically

  

BeautifulSoup构造函数的第一个参数是字符串或   打开文件句柄 - 您要解析的标记。第二个论点是如何   你想要解析标记。

     

如果您没有指定任何内容,您将获得最佳的HTML解析器   安装。然后,Beautiful Soup将lxml的解析器列为最佳解析器   html5lib,然后是Python的内置解析器。

以下是正在发生的事情的演示:

>>> import urllib2
>>> from bs4 import BeautifulSoup
>>> url = 'http://www.amazon.com/dp/B00IOXUJRY'

>>> page = BeautifulSoup(urllib2.urlopen(url), 'html.parser')
>>> print page.find(id='productTitle') 
None

>>> page = BeautifulSoup(urllib2.urlopen(url), 'html5lib')
>>> print page.find(id='productTitle')
<span class="a-size-large" id="productTitle">Keurig, The Original Donut Shop, K-Cup packs (Regular - Medium Roast Extra Bold, 24 Count)</span>

>>> page = BeautifulSoup(urllib2.urlopen(url), 'lxml')
>>> print page.find(id='productTitle')
<span class="a-size-large" id="productTitle">Keurig, The Original Donut Shop, K-Cup packs (Regular - Medium Roast Extra Bold, 24 Count)</span>

换句话说,解决方案是明确指定解析器,html5liblxml - 但请确保安装了这些模块。


要获取产品说明,您无需使用selenium+PhantomJS方法。您可以使用BeautifulSoup

来获取它
print page.find('div', class_='productDescriptionWrapper').text.strip()

打印:

  

咖啡人甜甜圈店K-Cup咖啡是一种中度烘焙咖啡   让人想起你在经典甜甜圈柜台找到的一杯乔   整个美国。甜美而丰富的甜点口味   每一杯,这款经典咖啡即使对那些人也很平易近人   谁怕咖啡苦涩。甜美的味道设置咖啡人甜甜圈   除了普通的咖啡混合物外,还可以购买咖啡,现在就可以了   享受这款独特的咖啡与单杯K-Cup的便利   笔芯。包括24个K杯。