【问题标题】:Missing value while parsing webpage with BeautifulSoup 4使用 BeautifulSoup 4 解析网页时缺少值
【发布时间】:2016-03-03 08:55:23
【问题描述】:

作为练习作业,我正在尝试使用 BeautifulSoup 库从亚马逊解析 this search results page

这是我的代码。

from urllib import urlopen
from bs4 import BeautifulSoup


SourceURL = "http://www.amazon.in/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=android"
ResultsPage = urlopen(SourceURL )
Soup = BeautifulSoup(ResultsPage)


print "<SearchResults>"

for SearchResult in Soup.findAll('li', attrs={'class': 's-result-item celwidget'}):
    #Read Result Title
    Title = SearchResult.find("h2", {"class": "a-size-medium a-color-null s-inline s-access-title a-text-normal"})

    ResultTag = "\t<Result><![CDATA["
    if Title is not None:
        ResultTag += Title.text

    ResultTag += "]]></Result>"
    print ResultTag

print "</SearchResults>"

显示的输出如下

<SearchResults>
    <Result><![CDATA[Micromax Bolt S301 (Black, No charger, No earphone inbox)]]></Result>
    <Result><![CDATA[Android Application Development (with Kitkat Support), Black Book]]></Result>
    <Result><![CDATA[ZTE Blade Buzz White V815W]]></Result>
    <Result><![CDATA[Android:  App Development & Programming Guide: Learn In A Day! (Android, Rails, Ruby Programming, App Development...]]></Result>
    <Result><![CDATA[]]></Result>
    <Result><![CDATA[Karbonn Titanium S21 (Grey)]]></Result>
    <Result><![CDATA[Head First Android Development]]></Result>
    <Result><![CDATA[Micromax Canvas A1 Android One (White, 8GB)]]></Result>
    <Result><![CDATA[Professional Android 4 Application Development (Wrox)]]></Result>
    <Result><![CDATA[OnePlus X (Onyx) - Invite Only]]></Result>
    <Result><![CDATA[Lenovo Vibe S1 (4G, White)]]></Result>
    <Result><![CDATA[Micromax Bolt D320 (Black, 4GB)]]></Result>
    <Result><![CDATA[2 in 1 Capacitive Stylus Pen With Black Ball Pen for Android Touch Sceen Mobile Phones and Tablets All iPads and...]]></Result>
    <Result><![CDATA[Moto E 2nd Generation XT1506 (3G, Black)]]></Result>
    <Result><![CDATA[Android: App Development & Programming Guide: Learn In A Day!]]></Result>
    <Result><![CDATA[Lenovo Vibe S1 (4G, Dark Blue)]]></Result>
</SearchResults>

如果您注意到,由于某种原因,输出中缺少第五个结果,而它使用相同的代码打印所有其他行。本质上,SearchResult.find() 方法只为一条记录返回 NULL 值。

如果我遗漏了什么,请告诉我吗?

谢谢, 尼基尔

【问题讨论】:

  • 我刚刚在该页面上运行了l=document.querySelectorAll('li.s-result-item.celwidget'); for ( var i = 0; i &lt; l.length; i++ ) {console.log(l.item(i)); k=l[i].querySelectorAll('h2.a-size-medium.a-color-null.s-inline.s-access-title.a-text-normal'); for ( var j = 0; j &lt; k.length; j++ ) console.log(" ", k[j].innerHTML); },它确实正确列出了所有内容,因此至少 HTML 标记没有什么奇怪的地方。也许您可以在 if 中添加一个else,将 li 的 the path 添加到结果中?

标签: python beautifulsoup html-parsing missing-data


【解决方案1】:

如果您查看链接 http://www.amazon.in/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=android,则第 5 个 li 元素与您的类名标准 s-result-item celwidget(实际上是 Customers shopped for android in)匹配,并且不完全符合您的第二个标准 a-size-medium a-color-null s-inline s-access-title a-text-normal,即导致Title 设置为无。

您可能可以将您的条件更新到下面以打印所需的输出。

if Title is not None:
    ResultTag = "\t<Result><![CDATA["
    ResultTag += Title.text
    ResultTag += "]]></Result>"
    print ResultTag

【讨论】:

  • 谢谢@akotian。您能否解释一下“实际上是客户在其中购买了 android 并且不完全符合您的第二个标准 a-size-medium a-color-null s-inline s-access-title a-text-normal”。只是好奇,因为其他结果(可能由服务器端的相同代码产生)符合相同的标准。
  • 如果您在浏览器窗口中打开您发布的链接和open javascript console,您可以看到我在说什么。 document.getElementsByClassName('s-result-item')[3].getElementsByClassName("a-size-medium a-color-null s-inline s-access-title a-text-normal") 将返回一个元素 document.getElementsByClassName('s-result-item')[4].getElementsByClassName("a-size-medium a-color-null s-inline s-access-title a-text-normal") 返回空。因为这就是 html 的设置方式。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2012-10-04
  • 2020-02-25
  • 2013-06-19
  • 2017-08-21
  • 2021-08-20
相关资源
最近更新 更多