【问题标题】:Python skipping XML child nodes while parsing in BeautifulSoupPython 在 BeautifulSoup 中解析时跳过 XML 子节点
【发布时间】:2018-05-22 02:22:57
【问题描述】:

我遇到了一组子标签没有完全解析的问题。我对其他标签遵循与此相同的逻辑,但由于某些原因,我看不到它跳过了我想要的标签的第一个条目之外的所有内容。我当前脚本的基本 sn-p 如下所示:

for xml_string in separated_xml(infile):

   soup = BeautifulSoup(xml_string, "lxml")

        us_grant = soup.findAll("us-patent-grant")

        with open('./output.csv', 'ab+') as f:
            writer = csv.writer(f, dialect = 'excel')

            for info in us_grant:

              data = []
              us_class_search = soup.findAll("us-field-of-classification-search")

              for item2 in us_class_search:

                if item2.find("classification-national"):

                  country_search = item2.find("country")
                  main_class_search = item2.find("main-classification")

                  data.append((country_search).text)
                  data.append((main_class_search).text)
              print(data)

一旦我在每次迭代后print(data),它只会给我每个 countrymain-classification 标签下的每个 first entry em>us-patent-grant 父母;但还有更多。例如,带有这些标签的 XML 文件如下所示:

<us-field-of-classification-search>
<classification-national>
<country>US</country>
<main-classification>D 1100-130</main-classification>
<additional-info>unstructured</additional-info>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>D 1199</main-classification>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>426  5</main-classification>
</classification-national>
<classification-national>
<country>US</country>
<main-classification>426 76</main-classification>
</classification-national>
</us-field-of-classification-search>

我知道 if item2 语句 没有正确执行,因为即使我将其取出,它仍然会以相同的方式运行 for item2 循环;仅查找并附加每个标签下的第一个标签。这意味着它必须是循环本身没有运行并找到每个实例并将第一个标签视为所有实例。

有什么想法吗?我没有看到任何明显的逻辑错误。

如果您想查看 XML 本身,可以找到它here on USPTO

【问题讨论】:

    标签: python xml parsing beautifulsoup tags


    【解决方案1】:

    引入 for-loop 时的简单修复:

    for items in item2.findAll("classification-national")
    

    允许我点击父组件中的每个组件。

    【讨论】:

      【解决方案2】:

      item2 正在遍历所有 &lt;us-field-of-classification-search&gt; 元素,您的示例中只有一个。

      在该循环中,您应该迭代 &lt;classification-national&gt; 元素,但您只检查第一个。

      【讨论】:

      • 难道 if 语句不应该处理这个问题吗?我对其他父标记进行相同类型的解析,并且 if 语句确保收集重复标记的每个实例。我将它用于同一文件中的另一个标签,它可以工作。
      • if 语句不会导致循环发生。我认为您不清楚 item2 循环正在迭代什么。单步调试调试器中的代码,看看发生了什么。
      • 谢谢。只需引入一个for items in item2.findAll("classification-national) 循环就可以得到所有标签。
      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多