【问题标题】:BeautifulSoup find function unusual behaviourBeautifulSoup 发现函数异常行为
【发布时间】:2014-10-30 22:29:13
【问题描述】:
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 太慢了) 任何其他库,如 mechanize 或 robobrowser 等?

【问题讨论】:

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


    【解决方案1】:

    您正在体验 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()
    

    打印:

    Coffee People Donut Shop K-Cup Coffee 是一款中度烘焙咖啡 让人想起你在经典甜甜圈柜台找到的一杯乔 遍布美国。甜而丰富的甜品风味 每一杯,这款经典咖啡即使是那些 害怕咖啡苦味的人。甜咸口味套装咖啡人甜甜圈 除了普通的混合咖啡外,还可以购买咖啡,现在您可以 享受这种独特的咖啡,享受单杯 K-Cup 带来的便利 笔芯。包括 24 个 K 杯。

    【讨论】:

    • 哇!棒极了。我们怎么知道我们应该为哪个页面使用这个解析器?我的意思是,就像现在我知道,如果将来我遇到同样的错误,我会尝试不同的解析器。但它是命中和试用还是我们可以通过查看页面来识别?或者一般来说你更喜欢什么解析器?
    • @xyz 好吧,解析器在不同方面是不同的,比如一个比另一个更宽松,另一个更快等等 - 所以这基本上取决于你正在解析的网页和你需要的数据,以及您需要多快。就我个人而言,我通常尽可能使用lxml。希望对您有所帮助。
    猜你喜欢
    • 2017-07-18
    • 2011-10-18
    • 2022-12-04
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多