BeautifulSoup查找功能不寻常的行为

问题描述:

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个小时,但无法找到原因。可能是我正在做一个我不知道的非常小的愚蠢错误?BeautifulSoup查找功能不寻常的行为

PS:我有一个更多的查询。 “重要信息”部分下方有“产品说明”部分。这是javascript生成的内容(我认为是这样?)。所以我必须使用硒/幻影类库。有没有什么办法可以从beautifulsoup或python的内置库中获取这些内容(因为硒太慢) 任何其他类似mechanize或robobrowser等的库?

您正在使用BeautifulSoup所使用的differences between parsers

既然你没有明确指定,BeautifulSoupchooses 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杯咖啡是一个中等烤咖啡 让人想起乔,你觉得在经典的甜甜圈柜台 杯整个美国。这款经典咖啡每个单杯都有 甜点和丰富的甜品口味,即使对那些害怕咖啡苦味的 也是平易近人的。甜咸味套餐咖啡人甜甜圈 除了普通咖啡混合咖啡外,还可以购买 享受这款独一无二的咖啡,方便单杯K-Cup 补充。包括24个K杯。

+0

Whoaa!棒极了。我们如何知道我们应该使用这个解析器的哪个页面?我的意思是,就像现在我知道,如果将来我遇到同样的错误,我会尝试不同的解析器。但是它是否被打击和试用,或者我们可以通过查看页面来识别? 或者大体上你喜欢什么语法分析器? – xyz 2014-09-06 06:07:53

+0

@xyz好了,解析器在不同的术语中是不同的,比如一个比另一个更宽松,另一个更快等 - 所以这主要取决于你正在解析的网页和你需要的数据,以及你需要多快。就我个人而言,我通常会使用'lxml'。希望有所帮助。 – alecxe 2014-09-06 06:26:18