【问题标题】:AttributeError while get text from html从html获取文本时出现AttributeError
【发布时间】:2017-11-28 00:32:16
【问题描述】:

我不知道发生了什么,但两天前相同的代码仍在工作!

我尝试使用 itemprop = "name" 获取文本,这是所提供项目的标题。在这种情况下:“色板”。

import requests
import bs4
response2 = requests.get('https://www.willhaben.at/iad/kaufen-und-verkaufen/d/swatch-209522646/').content

soup2 = bs4.BeautifulSoup(response2, "lxml")

texttitle = soup2.find(itemprop = "name").get_text().strip()
print(texttitle)

我怎么总是得到AttributeError: 'NoneType' object has no attribute 'get_text' 谁能解释我为什么会得到 AttributeError?非常感谢。

编辑:

我也尝试直接使用 css 路径定位它,但这并没有给我任何结果。 作者:

texttitle = soup2.find('div.adHeadingLine div.adHeading h1.header.cXenseParse').get_text().strip()

【问题讨论】:

  • 只是text() 而不是get_text()
  • 主要是因为 soup2.find(itemprop = "name") 实际上返回 None。您应该打印出所有调用的结果以查看实际返回的结果,并更深入地检查以了解真正的 问题所在。从那里,您可以确定应该采取哪些措施来解决问题。
  • 同样 text() 给出同样的错误。
  • @fahrradlaus 不可能知道谁对你投了反对票,所以最好永远不要假设并试图呼吁人们反对它。此外,无论此处使用哪种方法正确,您在自己的故障排除中都错过了几个步骤。我之前的评论提供了一些背景信息。
  • @idjaw 抱歉,我只是觉得在没有任何评论的情况下投反对票是不公平的。尽管如此,我在定位 css 路径时尝试了一些故障排除,但这并没有把我带到任何地方。

标签: python html css beautifulsoup


【解决方案1】:

你得到的错误表明页面上没有这样的元素。 昨天可能是,但网站的标记可能会改变。

你可以保证你给出条件的元素确实存在:

from bs4 import BeautifulSoup
from urllib2 import urlopen

response = urlopen('https://www.willhaben.at/iad/kaufen-und-verkaufen/d/swatch-209522646/')
soup = BeautifulSoup(response, "lxml")

if soup.find(itemprop='name'):
    texttitle = soup.find(itemprop='name').text.strip()
    print(texttitle)
else:
    print('no such element') 

【讨论】:

  • 非常感谢,但实际上网站上有这样的元素。它位于 css 路径:html body.frontend.page-object div#page-container div#page-container-inner div#page-content.clearfix div#box-maincontent.boxBlueRoundedCorners.bap div.wh-anzeige div.adHeadingLine div.adHeading h1.header.cXenseParse 所以我想知道它是否与我最近的 python 更新有关......
  • 我会做什么:查看网站的“查看源代码”,而不是检查。找到那个元素,查看它的属性,选择那些,这将帮助你唯一地识别这个元素。并将这个条件放到你的 find()
  • 这基本上正是我想要做的。独特的元素正是我选择的那个,但它总是给我一个 AttributeError。在此示例中,我只是尝试获取标题“Swatch”。
  • 我稍微检查了这个页面。页面加载后似乎出现了这个标题,那里执行了一些 javascript。不撞墙的简单选择是使用 seleium 库,它模拟浏览器并在 pseudobrouser - webdriver 中物理加载页面。
【解决方案2】:

返回 None 的原因是,该 HTML 页面中没有具有名为 itemprop 的属性且其值设置为 name 的元素。

看源码,肯定有元素使用itemprop属性,比如:

<div itemprop='description' class="description">
    Batterie leer,ansonsten funktionsfähig!
</div>

<div itemprop='offers' itemscope itemtype='http://schema.org/Offer' class="container right">

但是没有像&lt;div itemprop='name'&gt; 这样的元素,这就是为什么你会得到None

@dmitriy 是正确的,最可能的原因是网站已更新。

【讨论】:

  • 感谢您的帮助。但是如果我看网站,&lt;h1 class="header cXenseParse" itemprop="name"&gt;Swatch&lt;/h1&gt;有这样一个元素
  • 如下所述,它位于css路径:html body.frontend.page-object div#page-container div#page-container-inner div#page-content.clearfix div#box-maincontent.boxBlueRoundedCorners.bap div.wh-anzeige div.adHeadingLine div.adHeading h1.header.cXenseParse
  • 抱歉,我在 HTML 源代码中没有看到该元素。也许您正在查看不同的网页。 Web服务器很可能会根据用户(地理位置等)呈现不同的内容。我建议您分享一个指向您所看到的 HTML 源代码的链接 (jsfiddle.net)。
  • 好吧,我试着把它保存在 jsfiddle.net。从来没有用过,但它是这样工作的吗? jsfiddle.net/ze6rj6y4
  • 那不是有效的 html。将其保存为 .html 文件并在浏览器中打开它,您会发现它无法正确呈现。获取源代码(Win/Chrome 中的 ctrl+u)并将原始内容保存到文件中。
猜你喜欢
  • 1970-01-01
  • 2021-02-15
  • 2011-03-01
  • 2018-11-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多