【问题标题】:Beautiful soup parsing XML incorrectly美丽的汤错误地解析 XML
【发布时间】:2019-01-26 14:36:00
【问题描述】:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd">
<page number="1" position="absolute" top="0" left="0" height="1188" width="918">
<text top="301" left="136" width="223" height="17" font="4"><b>– Jul-18            ABC  </b></text>
<text top="495" left="136" width="258" height="17" font="4"><b>– Aug-16</b>                     <b>XYZ                  </b></text>
</page>

Beautiful Soup 使用 xml/lxml/lxml-xml 解析器无法正确解析 second &lt;text&gt; 元素。它删除了Aug-16XYZ 之间的空格。它将其解析为

<text font="4" height="17" left="136" top="495" width="258"><b>– Aug-16</b> <b>XYZ                  </b></text>

这是不正确的。我也尝试过使用from_encoding="utf-8" 选项制作汤。没有一个有效。

【问题讨论】:

  • 能否再添加一些代码 sn-p,如何获取文本?喜欢使用 .text 或 get_text() 方法
  • 在使用 soup.find_all('text') 选择文本元素后,我在文本元素上使用 get_text()

标签: python xml beautifulsoup xml-parsing


【解决方案1】:

可能你需要尝试这种方式,

from bs4 import BeautifulSoup
text = """
    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd">
<page number="1" position="absolute" top="0" left="0" height="1188" width="918">
<text top="301" left="136" width="223" height="17" font="4"><b>– Jul-18            ABC  </b></text>
<text top="495" left="136" width="258" height="17" font="4"><b>– Aug-16</b>                     <b>XYZ                  </b></text>
</page>
"""

soup = BeautifulSoup(text, 'html.parser')
for i in soup.find_all('text'):
    print(i.get_text(separator=u' ', strip=False))

#Output as : – Jul-18            ABC  
#             – Aug-16   XYZ    

【讨论】:

  • 在您的示例中,Aug-16XYZ 之间的大量空格也将被删除。
  • @AshutoshPathak 实际上在您的 xml 文本中解析时显示如下,&lt;text font="4" height="17" left="136" top="301" width="223"&gt;&lt;b&gt;– Jul-18 ABC &lt;/b&gt;&lt;/text&gt; &lt;text font="4" height="17" left="136" top="495" width="258"&gt;&lt;b&gt;– Aug-16&lt;/b&gt; &lt;b&gt;XYZ &lt;/b&gt;&lt;/text&gt; 不是您想的那样
  • 看看这就是问题所在。在实际的 xml 中,它们之间有空格,但是当 BS4 解析它时,它们会被删除。您可以通过打印汤元素本身来查看。
  • 当你美化这个 xml 时,它会像这样&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd"&gt; &lt;page number="1" position="absolute" top="0" left="0" height="1188" width="918"&gt; &lt;text top="301" left="136" width="223" height="17" font="4"&gt; &lt;b&gt;– Jul-18 ABC &lt;/b&gt; &lt;/text&gt; &lt;text top="495" left="136" width="258" height="17" font="4"&gt; &lt;b&gt;– Aug-16&lt;/b&gt; &lt;b&gt;XYZ &lt;/b&gt; &lt;/text&gt; &lt;/page&gt; 和 bs4 和 xml 库在标签的基础上工作而不是在空间上工作,所以它不会在你的情况下保留两个标签之间的空格。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2013-04-29
相关资源
最近更新 更多