python3 xpath无法到达子节点(AttributeError:'NoneType'对象没有属性'text')(python3 xpath can't reach a child node (AttributeError: 'NoneType' object has no attribute 'text'))

需要帮助解决一些我无法找到的问题

我有一个像这样的xml:

<forecast xmlns="http://weather.yandex.ru/forecast" country_id="8996ba26eb0edf7ea5a055dc16c2ccbd" part="Лен Стокгольм" link="http://pogoda.yandex.ru/stockholm/" part_id="53f767b78d8f180c28d55ebda1d07e0c" lat="59.381981" slug="stockholm" city="Стокгольм" climate="1" country="Швеция" region="10519" lon="17.956846" zoom="12" id="2464" source="Station" exactname="Стокгольм" geoid="10519">
<fact>...</fact>
<yesterday id="435077826">...</yesterday>
<informer>...</informer>
<day date="2016-04-18">
    <sunrise>05:22</sunrise>
    <sunset>20:12</sunset>
    <moon_phase code="growing-moon">14</moon_phase>
    <moonrise>15:53</moonrise>
    <moonset>04:37</moonset>
    <biomet index="3" geomag="2" low_press="1" uv="1">...</biomet>
    <day_part typeid="1" type="morning">...</day_part>
    <day_part typeid="2" type="day">...</day_part>
    <day_part typeid="3" type="evening">...</day_part>
    <day_part typeid="4" type="night">...</day_part>
    <day_part typeid="5" type="day_short">
        <temperature>11</temperature>
    </day_part>
</day>
</forecast>

(可以通过https://export.yandex.ru/weather-ng/forecasts/2464.xml访问整个xml)。 需要获取temperature.text(11),尝试此代码:

import urllib.request
import codecs
import lxml
from xml.etree import ElementTree as ET

def gen_ns(tag):
    if tag.startswith('{'):
        ns, tag = tag.split('}') 
        return ns[1:]
    else:
        return ''
with codecs.open(fname, 'r', encoding = 'utf-8') as t:
        town_tree = ET.parse(t)
        town_root = town_tree.getroot() 
        print (town_root)

        namespaces = {'ns': gen_ns(town_root.tag)}
        print (namespaces)

        for day in town_root.iterfind('ns:day', namespaces):
            date = (day.get('date'))
            print (date)
            day_temp = day.find('.//*[@type="day_short"]/temperature')  
            print (day_temp.text)

得到:

Traceback (most recent call last):
File "weather.py", line 154, in <module>
    print (day_temp.text)
AttributeError: 'NoneType' object has no attribute 'text'

我的xpath有什么问题? 我可以得到('.//*[@type="day_short"]') attr,但是不能得到它的孩子(温度)文本谢谢大家!


need help with some issue I didn't manage to find

I have an xml like this:

<forecast xmlns="http://weather.yandex.ru/forecast" country_id="8996ba26eb0edf7ea5a055dc16c2ccbd" part="Лен Стокгольм" link="http://pogoda.yandex.ru/stockholm/" part_id="53f767b78d8f180c28d55ebda1d07e0c" lat="59.381981" slug="stockholm" city="Стокгольм" climate="1" country="Швеция" region="10519" lon="17.956846" zoom="12" id="2464" source="Station" exactname="Стокгольм" geoid="10519">
<fact>...</fact>
<yesterday id="435077826">...</yesterday>
<informer>...</informer>
<day date="2016-04-18">
    <sunrise>05:22</sunrise>
    <sunset>20:12</sunset>
    <moon_phase code="growing-moon">14</moon_phase>
    <moonrise>15:53</moonrise>
    <moonset>04:37</moonset>
    <biomet index="3" geomag="2" low_press="1" uv="1">...</biomet>
    <day_part typeid="1" type="morning">...</day_part>
    <day_part typeid="2" type="day">...</day_part>
    <day_part typeid="3" type="evening">...</day_part>
    <day_part typeid="4" type="night">...</day_part>
    <day_part typeid="5" type="day_short">
        <temperature>11</temperature>
    </day_part>
</day>
</forecast>

(the entire xml could be reached at https://export.yandex.ru/weather-ng/forecasts/2464.xml). need to get the temperature.text (11), trying this code:

import urllib.request
import codecs
import lxml
from xml.etree import ElementTree as ET

def gen_ns(tag):
    if tag.startswith('{'):
        ns, tag = tag.split('}') 
        return ns[1:]
    else:
        return ''
with codecs.open(fname, 'r', encoding = 'utf-8') as t:
        town_tree = ET.parse(t)
        town_root = town_tree.getroot() 
        print (town_root)

        namespaces = {'ns': gen_ns(town_root.tag)}
        print (namespaces)

        for day in town_root.iterfind('ns:day', namespaces):
            date = (day.get('date'))
            print (date)
            day_temp = day.find('.//*[@type="day_short"]/temperature')  
            print (day_temp.text)

getting:

Traceback (most recent call last):
File "weather.py", line 154, in <module>
    print (day_temp.text)
AttributeError: 'NoneType' object has no attribute 'text'

what's wrong with my xpath? I can get attr of ('.//*[@type="day_short"]'), but can't get its child (temperature) text Thanks everyone!


原文:https://stackoverflow.com/questions/36726768
2024-04-13 09:04

满意答案

  • dict{...}是错的,它应该是dict(...)OrderedDict{...}
  • dictOrderedDict将序列作为参数
  • 你的元组列表中有('e':8,'data[1]','9') 。 应该是('e',8),('data[1]','9')

这会产生一个dict (它相当于你发布的工作dict文字),它总是无序的

payload = dict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')])

这会产生一个元组元组 ,这些元组的 请求不会作为data参数:

payload = (('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15'))

剩下的两个( 有序字典元组列表 )将产生你想要的东西:

from collections import OrderedDict
payload = OrderedDict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e',8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')])
payload = [('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')]

  • dict{...} is wrong, it should be dict(...). Same goes for OrderedDict{...}
  • dict and OrderedDict take a sequence as argument
  • you have ('e':8,'data[1]','9') within your list of tuples. Should probably be ('e',8),('data[1]','9').

This produces a dict (it's equivalent to the working dict literal you posted), which will always be unordered:

payload = dict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')])

This produces a tuple of tuples, which requests doesn't take as argument for data:

payload = (('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15'))

The remaining two (ordered dictionary and list of tuples) will produce what you want:

from collections import OrderedDict
payload = OrderedDict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e',8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')])
payload = [('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')]

相关问答

更多

Python使用三个参数请求库HTTPBasicAuth(Python requests library HTTPBasicAuth with three parameters)

HTTPBasicAuth()只能使用用户名和密码参数。 没有第三个参数,完整的。 HTTP基本认证为请求添加额外的头部; 此信息与GET或POST参数保持分开。 当您使用此形式的身份验证时,您不需要将任何username和password参数传递给API方法。 要添加书签,请将url参数作为POST或GET数据参数传入: requests.post('https://www.instapaper.com/api/add', data={'url': 'websiteUrl'}, auth=HT...

记录来自python-requests模块的所有请求(Log all requests from the python-requests module)

底层urllib3库使用日志logging模块记录所有新的连接和URL,但不logging POST主体。 对于GET请求,这应该是足够的: import logging logging.basicConfig(level=logging.DEBUG) 这给你最详细的日志记录选项; 有关如何配置日志记录级别和目的地的详细信息,请参阅日志HOWTO 。 简短演示: >>> import requests >>> import logging >>> logging.basicConfig(lev...

Python请求和Instagram(Python requests and instagram)

它会在文档中准确地告诉您发生了什么。 此时,我们向用户显示登录屏幕,然后在确认屏幕上向您的应用授予访问其Instagram数据的权限 ,如果您运行下面的代码片段,您将看到一个登录框在您的浏览器中: import requests import webbrowser from tempfile import NamedTemporaryFile params = {"client_id": client_id, "redirect_uri": redirect_uri, ...

在python3请求中传递参数而不转义(passing parameters without escaping in python3 requests)

当你说“我的网址看起来像这样: http://example.site.com/customers?fields=id,first_name,last_name : http://example.site.com/customers?fields=id,first_name,last_name ,first_name, http://example.site.com/customers?fields=id,first_name,last_name ”时,我认为你的意思是你的网址在浏览器中的样子。 ...

Python请求:在发布请求中使用不同的主体类型参数(Python requests: Use of different body type parameters in post request)

使用files参数说明“用于多部分编码上传”。 使用data参数时,多部分http响应不是默认值,因此两者不等效。 请参阅什么是http multipart请求? 具体来说,使用files参数生成一个multipart/form-data POST,而不是application/x-www-form-urlencoded 。 Using the files argument states "for multipart encoding upload". A multi part http resp...

具有参数的Python请求(Python requests with parameters)

我建议urllib2作为替代方案,而不是使用request 。 这是一个例子。 我试过了,并成功检索了所需的输出。 import urllib2 import urllib params = urllib.urlencode({"cp":"03/10/2017 07:30", "int":1, "pair":1, "candles":50,"timezone":12, "candlestype":0, "prevTzId":12, "inst":10351841}) target = "ht...

python微框架和请求库(python microframeworks and the requests library)

Flask以Werkzeug为基础。 Werkzeug本身正在使用Request本身正在使用BaseRequest 。 但这不是Requests库。 请注意,有计划使用Requests和Werkzeug创建一个httpcore库 ,但这似乎已停止。 这说两个项目都在踢。 有些人使用请求在他们的应用程序中修改了 Flask Flask is based on Werkzeug. Werkzeug itself is using Request which itself is using BaseRe...

有序请求参数python(ordered requests parameters python)

dict{...}是错的,它应该是dict(...) 。 OrderedDict{...} dict和OrderedDict将序列作为参数 你的元组列表中有('e':8,'data[1]','9') 。 应该是('e',8),('data[1]','9') 。 这会产生一个dict (它相当于你发布的工作dict文字),它总是无序的 : payload = dict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se...

理解python请求会话参数(understanding python requests session parameters)

您要查找的完整URL位于您从请求中返回的响应对象中: resp = self.session.request(self.method, full_url, data=self.post_data, timeout=self.api.timeout, auth=auth, proxies=self.api.pr...

如何在python中使用list作为参数进行发布请求?(how to make post requests using with list as parameters in python? [closed])

看起来自定义受众群体定位API中的所有POST方法都采用编码为JSON的查询参数。 在Sharing Audiences调用中给出的示例使用整数作为adaccounts值,因此在转换为JSON之前,请确保您的整数是整数: import json import requests adaccounts = [1337845464515, 13464645456566] audienceid = ['6018213515', '601816526'] params = {adaccounts: js...

相关文章

更多

python2和python3的区别

python2和python3的区别,1.性能 Py3.0运行 pystone benchmark的速 ...

Object Oriented Programming

Some might also contend that inheritance should be ...

Cannot expose request attribute 'website' because of an existing model object of the same name 的解决方案

在使用springmvc+freemarker,有可能你会遇到以下异常(如:资源找不到重定向到404的 ...

Don’t work. Be hated. Love someone.

http://halfhalf.posterous.com/dont-work-be-hated-lo ...

Becoming a data scientist

Data Week: Becoming a data scientist Data Pointed, ...

Guava学习笔记:复写的Object常用方法

  在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,h ...

Full-Text Search in ASP.NET using Lucene.NET

This post is about the full-text search engine ...

Python内建函数(A)

abs(x) 说明:abs(x)返回x的绝对值,如果参数是复数,则返回复数的模; 参数x:整 ...

Hadoop Backup Node

要了解 Hadoop Backup Node,要从Namenode的元数据说起。 我们都知道 ...

Spark - A Fault-Tolerant Abstraction for In-Memory Cluster Computing

http://spark-project.org/ 项目首页 http://shark.cs.berk ...

最新问答

更多

如何引用共享重复名称的不同枚举值?(How to refer to different enum values which share a duplicate name?)

你不能。 编译器应该警告你。 enum常量存在于全局命名空间中。 第二个定义是重新定义,应该产生错误。 You can't. And the compiler should warn you about that. enum constants live in the global namespace. The second definition is a redefinition that should produce an error.

如何定位一个元素,使其整齐地放置在包装线下(How to position an element such that it neatly rests under a wrapped line)

div { display:inline-block; width:100%; border: 1px solid #000; } p { display:inline; } .button-primary { float:right; } Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididun

将大量边缘插入OrientDB会导致崩溃(ODatabaseException)(Inserting Large Amounts of Edges into OrientDB causes crash (ODatabaseException))

尝试这样的东西来创建边缘 OrientVertex vertex = graph.getVertex(houseList.get(h1).getRid()); OrientVertex vertex2 = graph.getVertex(houseList.get(h2).getRid()); vertex.addEdge("similarity",vertex2,new Object[]{"score",houseSim[h1][h2]}); Well, seems like the pro

如何解决登录页面,而不是重定向(How to solve login page, not redirecting)

你可以尝试使用其他条件 prepare("SELECT * FROM users WHERE emailAddress=:umail"); $stmt->bindValue(":umail", $umail); $stmt->execute(); $userRow = $stmt->fetchAll();

弹性搜索中基于人类语言的搜索(Human language based searches in elasticsearch)

机器对自然语言的理解是一个尚未解决的问题,也是一个活跃的研究领域,所以简短的答案是否定的,弹性研究无法理解人类语言。 NLP通常通过信息提取来进行语义(理解),信息提取是NLP内的子字段。 Elasticsearch是一个很好的工具,但它不是为信息提取而设计的 - 它最好被认为是一个带有一些额外功能的索引工具。 您可能对命名实体识别(NER)和概念识别更感兴趣,以回答您所描述的在Elasticsearch中支持最少的查询类型。 您提出的问题实际上是一个非常难以回答的问题,这就是为什么亚马逊在搜索

内存分配器的开销(Overhead of memory allocator)

这并没有真正回答你的问题,但Boost最近刚刚在最新版本中添加了一个内存池库。 它可能不是你想要的,但有一个彻底的对齐处理可能会引发一个想法? 如果文档不够,总会有源代码。 This doesn't really answer your question, but Boost has just recently added a memory pool library in the most recent version. It may not be exactly what you want,

在jsp中使用jstl版本和jsp库获取错误(getting error with jstl version and jsp library using in jsp)

你Tomcat极度过时了。 Tomcat 5.5(Servlet 2.4)不支持jsp表达式语言。 有关适当的Tomcat版本,请参阅此页面 。 如果可以,请更新到Tomcat 7。 You Tomcat is extremly outdated. Tomcat 5.5 (Servlet 2.4) does not support the jsp expression language. See this page for an appropriate Tomcat version. Updat

()发布后如何再次播放MediaPlayer(How to play again MediaPlayer after release())

只要移动你的 final MediaPlayer soundda = MediaPlayer.create(this, R.raw.da); 在onClick()之前 soundda.start(); 因此无论您是否发布它,还是尚未创建,都需要在播放之前创建MediaPlayer 。 也不要使用this ,而要使用.this ,因为您将在OnClickListener移动代码,并将其视为OnClickListener对象,并且需要一个Context对象

断言纯RESTful应用程序要求HTTPS安全是否正确?(Is it correct to assert that pure RESTful applications require HTTPS to be secure?)

假。 每个请求都带有身份验证的事实并不意味着可以重播请求。 HTTP DIGEST可用于身份验证,并且无法重放摘要式身份验证,因为来自服务器的质询将在每个连接上携带不同的nonce,并且客户端无法重用nonce: 允许服务器随机数包含时间戳。 因此,服务器可以检查客户端提交的nonce属性,以防止重放攻击。 还允许服务器维护最近发布或使用的服务器现时值列表,以防止重用 要求HTTPS本身并不坏,它肯定会增加对流量的隐私和篡改保护,但不需要防止重放和复制粘贴攻击。 False. The fact

如何在Spring中销毁servlet时捕获Configuration类中的回调?(How to catch callback in Configuration class when servlet is destroyed in Spring?)

取决于您在项目中使用的弹簧版本,您可以通过这种方式实现它。 春天4.2+ class Foo { @EventListener public bar(ContextStoppedEvent event) { } } 春天<4.2 class Foo implements ApplicationListener { void onApplicationEvent(ContextStoppedEvent event); }