0

我有一些xml:

<sporsmal_liste>
    <sporsmal>
        <versjon>1.0</versjon>
        <besvart_av>
            <versjon>1.0</versjon>
            <doedsdato>0001-01-01T00:00:00</doedsdato>
            <etternavn>Giske</etternavn>
            <foedselsdato>1966-11-07T00:00:00</foedselsdato>
            <fornavn>Trond</fornavn>
            <id>TG</id>
            <kjoenn>mann</kjoenn>
        </besvart_av>
       <besvart_av_minister_id>NHD</besvart_av_minister_id>
       <besvart_av_minister_tittel>nærings- og handelsministeren</besvart_av_minister_tittel>
       <besvart_dato>2010-10-11T00:00:00</besvart_dato>
       <besvart_pa_vegne_av i:nil="true"/>
       <besvart_pa_vegne_av_minister_id i:nil="true"/>
       <besvart_pa_vegne_av_minister_tittel i:nil="true"/>
       <datert_dato>2010-09-30T00:00:00</datert_dato>
       <emne_liste/>
       <flyttet_til>ikke_spesifisert</flyttet_til>
       <fremsatt_av_annen i:nil="true"/>
       <id>47703</id>
       <rette_vedkommende i:nil="true"/>
       <rette_vedkommende_minister_id i:nil="true"/>
       <rette_vedkommende_minister_tittel i:nil="true"/>
       <sendt_dato>2010-10-01T00:00:00</sendt_dato>
       <sesjon_id>2009-2010</sesjon_id>
       <sporsmal_fra>
           <versjon>1.0</versjon>
           <doedsdato>0001-01-01T00:00:00</doedsdato>
           <etternavn>Nørve</etternavn>
           <foedselsdato>1951-03-29T00:00:00</foedselsdato>
           <fornavn>Elisabeth Røbekk</fornavn>
           <id>ELN</id>
           <kjoenn>kvinne</kjoenn>
           <fylke>
               <versjon>1.0</versjon>
               <id>MR</id>
               <navn>Møre og Romsdal</navn>
          </fylke>
          <parti>
              <versjon>1.0</versjon>
              <id>H</id>
              <navn>Høyre</navn>
          </parti>
     </sporsmal_fra>
     <sporsmal_nummer>1808</sporsmal_nummer>
     <sporsmal_til>
         <versjon>1.0</versjon>
         <doedsdato>0001-01-01T00:00:00</doedsdato>
         <etternavn>Giske</etternavn>
         <foedselsdato>1966-11-07T00:00:00</foedselsdato>
         <fornavn>Trond</fornavn>
         <id>TG</id>
         <kjoenn>mann</kjoenn>
     </sporsmal_til>
     <sporsmal_til_minister_id>NHD</sporsmal_til_minister_id>
     <sporsmal_til_minister_tittel>nærings- og handelsministeren</sporsmal_til_minister_tittel>
     <status>besvart</status>
     <tittel>Jeg viser til ... [longer text a have shortend..]</tittel>
     <type>skriftlig_sporsmal</type>
</sporsmal>
<sporsmal>   ... another sporsmal (question) </sporsmal>
<sporsmal> en the next one.... </sporsmal>
..more of these..
</sporsmal_liste>

到目前为止,我已经处理了这个问题:

from bs4 import BeautifulSoup

soup = BeautifulSoup(r.content) # where r.content is the xml (result from requests.get(url))

for question in soup.find_all('sporsmal'):
    # to get the id of the person this is a question to (sporsmal_til) I would:
    print question.sporsmal_fra.id.text

这行得通。它返回ELN,即提出问题的人的 ID。问题在于项目本身的 id (< sporsmal >),它是47703,但我似乎无法以“正常方式”得到它:

for question in soup.find_all('sporsmal'):
    print question.id.text  #this returns **TG** 

和“TG”应该是

question.besvart_av.id.text 
# answered by

或者

question.sporsmal_til.id.text 
# question for
# it's the same dude that is asked to answer, and who answers the question

它是。这两个都返回TG但是:

question.id.text

应该返回47703,但事实并非如此。(或者我怎样才能获得 id 47703?)

那么我在这里做错了什么?

PS:由于我这里的 xml 可能会让非挪威人感到有些困惑,因此我在示例中编辑并选择了名称不那么容易混淆的其他字段。

4

2 回答 2

4

我从这个问题中学到了一些东西。当您这样做时soup.<something>,与您期望的不同,这是一个递归调用。这就是为什么它给你ID“TG”,因为递归地它是第一个遇到的。

因此,据我了解,您可以像这样在同一级别上进行搜索:

>>> for q in soup.find_all("sporsmal"):
...     print q.find("id", recursive=False).text
... 
47703
>>> for q in soup.find_all("sporsmal"):
...     print q.find("id", recursive=True).text
... 
TG
>>> for q in soup.find_all("sporsmal"):
...     print q.find("id").text # By default, the recursive call is true.
... 
TG

我认为它是递归的一些原因:

>>> soup.id
<id>TG</id>

如果它不是递归的,那么以下将失败,因为sporsmal没有带有 tag 的孩子kjoenn。这证明它是递归的。

>>> soup.sporsmal.kjoenn
<kjoenn>mann</kjoenn>
于 2012-05-15T00:23:31.303 回答
1

这是第一个问题:您正在使用 HTML 解析器来解析 XML。由于这不是定义良好的 HTML,因此对结构感到困惑。要使用 BeautifulSoup 解析 XML,您需要安装 lxml,并像这样初始化汤:

soup = BeautifulSoup(r.content, "xml")

However, there is at least one more issue since this isn't parsing it properly either. Will update if I figure it out.

于 2012-05-15T00:28:10.193 回答