【问题标题】:Python BeautifulSoup can't read div tagPython BeautifulSoup 无法读取 div 标签
【发布时间】:2018-02-12 20:56:14
【问题描述】:

我正在尝试从此页面获取我正在从事的项目的产品:lazadapage ispection 使用:

from bs4 import BeautifulSoup
import urllib
import re
r = urllib.urlopen("http://www.lazada.co.id/catalog/?q=note+2").read()
soup = BeautifulSoup(r,"lxml")
letters = soup.findAll("span",class_=re.compile("product-card__name"))
print type(letters) 
print letters[0]

当我这样做时,我收到以下错误:

回溯(最近一次通话最后): 文件“C:/Python27/project/testaja.py”,第 9 行,在 打印字母[0] IndexError:列表索引超出范围

对此有什么想法吗?

【问题讨论】:

  • print(r) 输出什么?该代码对我来说很好。
  • 这段代码对我来说也完全没问题。我怀疑你要么没有访问权限(也许你经常抓取它并且服务器阻止了你 - 检查标头代码是否为 403)或者由于某种原因 HTML 从未一起发送。

标签: python beautifulsoup


【解决方案1】:

我认为您可能访问了他们的页面太多,在浏览器中导航并查看该页面在您的网络上返回的内容。

此外,您可以修改代码,以便在尝试抓取页面之前检查页面响应标头以确保页面正确返回。我修改了您的代码以显示以下示例:

from bs4 import BeautifulSoup
import urllib
import re

r = urllib.urlopen("http://www.lazada.co.id/catalog/?q=note+2")
header_code = r.getcode()

if header_code == 200:
    html = r.read()
    soup = BeautifulSoup(html, "lxml")
    letters = soup.findAll("span", {"class" : re.compile("product-card__name")})

    for letter in letters:
        print letter
else:
    print("oops, something went wonky. Page response was: %s"% header_code)

【讨论】:

  • 我尝试您的代码并获取标题代码 200 但仍然找不到元素 span 它没有返回任何其他解决方案先生?顺便说一句,我在 Windows 8 中使用 python 2.7.1.1
    提前谢谢你
  • 查看我在示例中是如何修改汤的 findAll 的,看看是否适合您。
  • 好的,现在试试。我没有意识到 beautifulsoup 4 使用的正则表达式与版本 3 不同。
  • 仍然没有运气先生,:( 但是当我准备向其他网络前 link 执行此操作时,它的工作正常但它仍然没有返回任何 lazada
  • 您能否确保 HTML 为您正确加载,而不是一些验证码或类似的东西?我已经针对这个页面进行了测试,它返回了一个完整的项目列表。