Python 使用BeautifulSoup解析xml:具有相同名称的多个标记-如何找到正确的ID
我有一些xml: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> &
<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(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给了他子树中的第一个问题。我现在正在努力研究这个问题。我现在已经这样做了,虽然我自己解决不了问题,但我感谢纠正。我现在已经这样做了,虽然我自己解决不了问题,但我感谢纠正。