Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用BeautifulSoup解析xml:具有相同名称的多个标记-如何找到正确的ID_Python_Xml Parsing_Beautifulsoup - Fatal编程技术网

Python 使用BeautifulSoup解析xml:具有相同名称的多个标记-如何找到正确的ID

Python 使用BeautifulSoup解析xml:具有相同名称的多个标记-如何找到正确的ID,python,xml-parsing,beautifulsoup,Python,Xml Parsing,Beautifulsoup,我有一些xml: <sporsmal_liste> <sporsmal> <versjon>1.0</versjon> <besvart_av> <versjon>1.0</versjon> <doedsdato>0001-01-01T00:00:00</doedsdato> &

我有一些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>
这很有效。它返回ELN,即提问者的id。问题在于项目本身的id(),它是47703,但我似乎无法“以正常方式”获取它:

而“TG”应该是

question.besvart_av.id.text 
# answered by

的确如此。这两种方法都返回TG,但是:

question.id.text
应该返回47703,但它没有返回。 (或者我如何才能获得id 47703?)

那么我做错了什么


PS:因为我这里的xml可能会让非挪威人感到困惑,所以我在我的示例中编辑并选择了其他名称不那么混乱的字段。

我从这个问题中学到了一些东西。当你做
汤。
时,与你期望的不同,它是一个递归调用。这就是为什么它会给你一个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 = BeautifulSoup(r.content, "xml")
我认为它是递归的一些原因:

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

我从这个问题中学到了一些东西。当你做
汤。
时,与你期望的不同,它是一个递归调用。这就是为什么它会给你一个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 = BeautifulSoup(r.content, "xml")
我认为它是递归的一些原因:

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

这里是第一个问题:您正在使用HTML解析器解析XML。由于这不是一个定义良好的HTML,它对结构感到困惑。要执行此操作,您需要安装lxml,并按如下方式初始化soup:

>>> 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 = BeautifulSoup(r.content, "xml")

然而,至少还有一个问题,因为这也不能正确地解析它。如果我弄明白了,就会更新。

这里是第一个问题:您正在使用HTML解析器解析XML。由于这不是一个定义良好的HTML,它对结构感到困惑。要执行此操作,您需要安装lxml,并按如下方式初始化soup:

>>> 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 = BeautifulSoup(r.content, "xml")

然而,至少还有一个问题,因为这也不能正确地解析它。如果我弄明白了,就会更新。

您的第一个代码段有
问题。sposmal_til.id.text
应该是
TG
。您确定
question.id.text
没有返回47703吗?很遗憾,是的
question.id.text
返回u'TG',u'EGS'等等。(例如,元素中的第一个id,但第一个在子节点(besvart_av)中,而不是我要查找的id。)您的第一个代码段有
问题。sposmal_til.id.text
应该是
TG
。您确定
question.id.text
没有返回47703吗?很遗憾,是的
question.id.text
返回u'TG',u'EGS'等等。(例如,elemens中的第一个id,但第一个在子节点(besvart_av)中,而不是我正在寻找的id。)不,它不执行递归调用-这是具有结构的全部要点。它在指定的子树中执行递归调用。是的,但他只对
标记执行find_all(),而不是
id
,当你在一个点后面放一个标记名时,重点是只在直接的子元素中搜索。是的,所以我仍然不确定解析树的点符号,但我认为这就是正在发生的事情
question.id
给了他子树中的第一个。我现在正试图研究这个问题。不,它不做递归调用-这就是有结构的全部意义。它在你指定的子树中做递归调用。是的,但他只是对
标记做一个find_all(),而不是
id
,当你把标记名放在一个点之后,重点是只在直系子代中搜索。是的,所以我仍然不确定解析树的点符号,但我认为这就是正在发生的事情<代码>问题.id给了他子树中的第一个问题。我现在正在努力研究这个问题。我现在已经这样做了,虽然我自己解决不了问题,但我感谢纠正。我现在已经这样做了,虽然我自己解决不了问题,但我感谢纠正。