【问题标题】:BeautifulSoup does not find any XML tagsBeautifulSoup 没有找到任何 XML 标签
【发布时间】:2020-10-29 10:25:45
【问题描述】:

我正在尝试从 XML 字典中提取具有特定属性的单词。例如,所有动词,由 Lemma 下的 Type 表示。然后我将根据定义或 Inflection 细分这些条目。但现在,我只需要探索 Beautifulsoup 对象。 我对 XML 很陌生。这是字典中的第一个条目。我将其关闭以使其成为有效的 XML(我希望如此)。 我正在尝试按照教程here

<?xml version='1.0' encoding='utf-8'?>
<Dictionary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="lexinAA.xsd">
  <Article ArticleID="1000002" Sortkey="a">
    <Lemma ID="1000002" LemmaID="1" Rank="350" Type="subst." Value="a" Variant="" VariantID="3, 4">
      <Phonetic File="v2/100021_1.mp3">a:</Phonetic>
      <Inflection Form="best.f.sing.">a:et</Inflection>
      <Inflection Form="obest.f.pl.">a:n</Inflection>
      <Inflection Form="best.f.pl.">a:na</Inflection>
      <Index Value="a" />
      <Index Value="a:et" />
      <Index Value="a:n" />
      <Index Value="a:na" />
      <Index Value="as" />
      <Index Value="a:ets" />
      <Index Value="a:ns" />
      <Index Value="a:nas" />
      <Lexeme ID="1" LexemeID="1000006" Lexemeno="1" VariantID="3">
        <Definition ID="9011000">första bokstaven i alfabetet</Definition>
        <Idiom DoubleID="2060026" ID="1000008" OldID="2">a och o
          <Definition DoubleID="2030380" ID="1000009">det viktigaste</Definition>
        </Idiom>
        <Idiom DoubleID="2060590" ID="1000010" OldID="1">har man sagt a får man också säga b
          <Definition DoubleID="2030824" ID="1000011">har man börjat får man fortsätta</Definition>
        </Idiom>
      </Lexeme>
      <Lexeme ID="2" LexemeID="1000013" Lexemeno="2" VariantID="4">
        <Definition ID="9011001">sjätte tonen i C-durskalan</Definition>
        <Compound ID="2000667" OldID="">a-moll</Compound>
        <Compound ID="2000668" OldID="">A-dur</Compound>
        <Index Value="a-moll" />
        <Index Value="a-molls" />
        <Index Value="a moll" />
        <Index Value="a molls" />
        <Index Value="A-dur" />
        <Index Value="A-durs" />
        <Index Value="A dur" />
        <Index Value="A durs" />
      </Lexeme>
    </Lemma>
  </Article>
</Dictionary>

这是我的 Beautifulsoup 代码

from bs4 import BeautifulSoup as bs


content = []
with open('swe_swe.xml', 'r') as file:
    content = file.readlines()
    content = "".join(content)
    bs_content = bs(content, 'lxml')

result = bs_content.find('Article')
print(result)
print(bs_content.find('Inflection Form="best.f.sing.">a:et'))

两次打印的结果都是无。

我对“文章”标签的期望是第一个单词“a”的整个第一个条目,或者只是一行:

ArticleID="1000002" Sortkey="a">

字典中的标签看起来与教程中的完全不同,所以我觉得我遗漏了一些明显的东西。

【问题讨论】:

  • 您能否编辑您的问题并在代码中添加您期望的两个print() 语句的确切输出(或任何其他预期输出)?另外,既然你要导入 lxml,你能用它代替 BS 吗?
  • @JackFleeting 我进行了更改,但由于 BS 无论如何都会导入 lxml,我只是删除了 lxml。我仍然想使用 BeautifulSoup,因为我在之前的尝试中发现 lxml 很棘手。

标签: python-3.x xml beautifulsoup


【解决方案1】:

在这种情况下,如果使用 css 选择器会更简单。请注意,元素名称是小写的。例如获取&lt;Article&gt;的文本:

for s in soup.select_one('article').stripped_strings:
          print(s)

另一个例子:

print(soup.select_one('inflection[form="best.f.sing."]'))

输出

<inflection form="best.f.sing.">a:et</inflection>

最后,获取Lexeme元素中LexemeID的属性值:

for lex in soup.select('lexeme'):
    print(lex.attrs['lexemeid'])

输出:

1000006
1000013

等等

【讨论】:

  • @Glubbdrubb 确实!顺便说一句,使用 lxml(作为库,而不仅仅是解析器) - 与 BS 不同,它使用 xpath - 搜索表达式将使用适当的大小写,如(例如):doc.xpath('//Inflection[@Form="best.f.sing."]/text()')。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多