【问题标题】:BeautifulSoup missing part of tagBeautifulSoup 缺少标签的一部分
【发布时间】:2021-12-27 09:19:34
【问题描述】:

我正在使用 BeautifulSoup 处理 XML 提要,但由于某种原因它跳过了部分参数标记。我已经尝试更改解析器(html.parser / html5lib / lxml),但都有相同的输出。

有人可以帮忙吗?

原始 XML 文件:

<SHOPITEM>
 <PRODUCTNO>DK28-SLV</PRODUCTNO>
 <PARAM>
  <PARAM_NAME>Způsob komunikace</PARAM_NAME>
  <VAL>WiFi pro internetové připojení</VAL>
 </PARAM>
</SHOPITEM>

BeautifulSoup 的输出:

<shopitem>
 <productno>DK28-SLV</productno> 
 <param_name>Způsob komunikace</param_name>
 <val>WiFi pro internetové připojení</val>
 <param/>
</shopitem>

期望的输出:

<shopitem>
 <productno>DK28-SLV</productno> 
 <param>      -------> This one is missing
  <param_name>Způsob komunikace</param_name>
  <val>WiFi pro internetové připojení</val>
 <param/>
</shopitem>

我的代码:

from bs4 import BeautifulSoup
import requests

source = requests.get("my-xml-feed-url").text
soup = BeautifulSoup(source, "lxml")

product = soup.find("shopitem")


for product in soup.find_all("shopitem"):
    productno = product.find("productno")
    print(productno)
    param = product.find("param")
    print(param)
    param_name = product.find("param_name")
    print(param_name)
    param_val = product.find("val")
    print(param_val)

更新: 经过测试将解析器更改为“xml”。

它有部分帮助,并且标签现在可以正确显示。但是 XML 文件现在在不同的地方损坏了。 似乎从大约。 1/2 的 XML 是可以的,但是前 1/2 的 XML 没有显示出来..

原始 XML:

<PARAM>
<PARAM_NAME>Funkce alarmu</PARAM_NAME>
<VAL>Ano, do mobilní aplikace</VAL>
</PARAM>

输出开始:

/PARAM_NAME> 
<VAL>Ano, do mobilní aplikace</VAL> 
</PARAM>

这是输出开始的地方。所以由于某种原因,这部分之前的 XML 部分被切断了。 在这一点之前和之后,XML 结构似乎没有什么不同。所以我认为没有理由这样做。

进一步输出就OK了:

<PARAM>
   <PARAM_NAME>
    Úhel záběru
   </PARAM_NAME>
   <VAL>
    60°
   </VAL>
  </PARAM>

【问题讨论】:

    标签: python parsing beautifulsoup lxml


    【解决方案1】:

    BeautifulSoup 默认假定您正在解析 HTML。因此,它会破坏您的 XML。你应该使用像这样的“xml”解析器BeautifulSoup(source, "xml")

    Docs

    默认情况下,Beautiful Soup 将文档解析为 HTML。要将文档解析为 XML,请将“xml”作为第二个参数传递给 BeautifulSoup 构造函数:

    soup = BeautifulSoup(markup, "xml")

    
    from bs4 import BeautifulSoup
    
    source = """
    <SHOPITEM>
     <PRODUCTNO>DK28-SLV</PRODUCTNO>
     <PARAM>
      <PARAM_NAME>Způsob komunikace</PARAM_NAME>
      <VAL>WiFi pro internetové připojení</VAL>
     </PARAM>
    </SHOPITEM>
    """
    soup = BeautifulSoup(source, "xml")
    
    
    product = soup.find("SHOPITEM")
    
    
    for product in soup.find_all("SHOPITEM"):
        productno = product.find("PRODUCTNO")
        print(productno)
        param = product.find("PARAM")
        print(param)
        param_name = product.find("PARAM_NAME")
        print(param_name)
        param_val = product.find("VAL")
        print(param_val)
    

    输出

    <PRODUCTNO>DK28-SLV</PRODUCTNO>
    <PARAM>
    <PARAM_NAME>Způsob komunikace</PARAM_NAME>
    <VAL>WiFi pro internetové připojení</VAL>
    </PARAM>
    <PARAM_NAME>Způsob komunikace</PARAM_NAME>
    <VAL>WiFi pro internetové připojení</VAL>
    

    注意:XML 是Case sensetive,所以你需要把标签的名字写成大写。

    【讨论】:

    • 谢谢。它有部分帮助,并且 标记现在可以正确显示。但是 XML 文件现在在不同的地方损坏了.. 似乎从大约。 XML 的 1/2 可以,但 XML 的前 1/2 没有显示。原始 XML: Funkce alarmuAno, do mobilní aplikace PARAM> 输出:/PARAM_NAME> Ano, do mobilní aplikace 这是输出开始的地方.. 所以由于某种原因,这部分之前的 XML 部分被切断了。在这一点之前和之后,XML 结构似乎没有什么不同。所以我认为没有理由这样做
    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 2023-01-22
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多