获取XML数据中的唯一值

时间:2018-03-09 19:49:09

标签: python xml

分为两部分问题。

首先,这是我目前正在尝试使用的代码。我想在BS上坚持使用lxml。

import requests
import lxml.etree
from requests.auth import HTTPBasicAuth

r= requests.get("https://somelinkhere/folder/?parameter=abc", auth=HTTPBasicAuth('username', 'password'))

root = lxml.etree.fromstring(r.content)
results = root.findall('entry')
textnumbers = [r.find('updated').text for r in results]
print (textnumbers)

输出只给我[]

和我正在使用的XML数据:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:apple-wallpapers="http://www.apple.com/ilife/wallpapers" xmlns:g-custom="http://base.google.com/cns/1.0" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:georss="http://www.georss.org/georss/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:cc="http://web.resource.org/cc/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:g-core="http://base.google.com/ns/1.0">
  <title>Feed from some link here</title>
  <link rel="self" href="https://somelinkhere/folder/?parameter=abc" />
  <link rel="first" href="https://somelinkhere/folder/?parameter=abc" />
  <id>https://somelinkhere/folder/?parameter=abc</id>
  <updated>2018-03-06T17:48:09Z</updated>
  <dc:creator>company.com</dc:creator>
  <dc:date>2018-03-06T17:48:09Z</dc:date>
  <opensearch:totalResults>4</opensearch:totalResults>
  <opensearch:startIndex>1</opensearch:startIndex>
  <entry>
    <title>123456789</title>
    <link rel="alternate" href="https://somelink/ticket/123456789" />
    <author>
      <name>usernameHere</name>
    </author>
    <id>https://somelink/ticket/123456789</id>
    <updated>2018-02-28T13:27:33Z</updated>
    <content>short_description$$$someTextHere</content>
    <summary>some summary here</summary>
    <dc:creator>usernameHere</dc:creator>
  </entry>
  <entry>
    <title>123456799</title>
    <link rel="alternate" href="https://somelink/ticket/123456799" />
    <author>
      <name>usernameHere</name>
    </author>
    <id>https://somelink/ticket/123456799</id>
    <updated>2018-03-20113:27:33Z</updated>
    <content>short_description$$$someTextHere</content>
    <summary>some summary here</summary>
    <dc:creator>usernameHere</dc:creator>
  </entry>

我要做的第一件事就是从<entry> - &gt;获取日期。 <updated>字段。

第二部分是计算独特日期。所以,如果我得到以下日期 2018年2月27日
2018年2月27日
2018年2月28日
2018-03-01

我的数量是3.

然而,第二部分只是奖金。我更关注如何从XML中获取这些值,我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

from bs4 import BeautifulSoup

soup = BeautifulSoup(r,'xml')
updates = soup.findAll('updated')
for update in updates:
    print(update.contents)

那应该有用。试试看。如果它不能按原样运作,那么它应该只需要很少的修补。

修改:find()只会发现第一次出现findAll()find_all()会找到所有

答案 1 :(得分:0)

解析XML结构时需要合并现有的命名空间:

root = lxml.etree.fromstring(r.content)
ns = {'ns': 'http://www.w3.org/2005/Atom'}
dates = [d.text for d in root.findall('ns:entry/ns:updated', ns)]

print(dates)

输出:

['2018-02-28T13:27:33Z', '2018-03-20113:27:33Z']