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。
既然你没有明确指定,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杯咖啡是一个中等烤咖啡 让人想起乔,你觉得在经典的甜甜圈柜台 杯整个美国。这款经典咖啡每个单杯都有 甜点和丰富的甜品口味,即使对那些害怕咖啡苦味的 也是平易近人的。甜咸味套餐咖啡人甜甜圈 除了普通咖啡混合咖啡外,还可以购买 享受这款独一无二的咖啡,方便单杯K-Cup 补充。包括24个K杯。
Whoaa!棒极了。我们如何知道我们应该使用这个解析器的哪个页面?我的意思是,就像现在我知道,如果将来我遇到同样的错误,我会尝试不同的解析器。但是它是否被打击和试用,或者我们可以通过查看页面来识别? 或者大体上你喜欢什么语法分析器? – xyz 2014-09-06 06:07:53
@xyz好了,解析器在不同的术语中是不同的,比如一个比另一个更宽松,另一个更快等 - 所以这主要取决于你正在解析的网页和你需要的数据,以及你需要多快。就我个人而言,我通常会使用'lxml'。希望有所帮助。 – alecxe 2014-09-06 06:26:18