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等?
答案 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>
换句话说,解决方案是明确指定解析器,html5lib
或lxml
- 但请确保安装了这些模块。
要获取产品说明,您无需使用selenium+PhantomJS
方法。您可以使用BeautifulSoup
:
print page.find('div', class_='productDescriptionWrapper').text.strip()
打印:
咖啡人甜甜圈店K-Cup咖啡是一种中度烘焙咖啡 让人想起你在经典甜甜圈柜台找到的一杯乔 整个美国。甜美而丰富的甜点口味 每一杯,这款经典咖啡即使对那些人也很平易近人 谁怕咖啡苦涩。甜美的味道设置咖啡人甜甜圈 除了普通的咖啡混合物外,还可以购买咖啡,现在就可以了 享受这款独特的咖啡与单杯K-Cup的便利 笔芯。包括24个K杯。