使用 import lxml.etree as ElementTree 抓取 xml 数据的最有效方法是什么

问题描述 投票:0回答:0

我正在尝试学习如何使用 XML 抓取网站。我对 html 非常熟悉,但我注意到我尝试抓取的一些网站具有 XML API。如果我没记错的话,它的抓取速度更快,也更简单。

我有以下示例代码。

txt = '''
<?xml version="1.0"?>
<DIV5 N="100" TYPE="HEADER">
   <HEAD>100: DIV5 Title</HEAD>
   <AUTH>
      <HED>Authority:</HED>
      <PSPACE>AUTHORITY SPACE</PSPACE>
   </AUTH>
   <SOURCE>
      <HED>Source:</HED>
      <PSPACE>Source Text.</PSPACE>
   </SOURCE>
   <DIV7 N="1" TYPE="SUB">
      <HEAD>1. DIV7Title 1</HEAD>
      <DIV8 N="1.1" TYPE="SECTION">
         <HEAD>1.1 DIV8Title 1</HEAD>
         <P> (1) Text 1</P>
      </DIV8>

      <DIV8 N="1.2" TYPE="SECTION">
         <HEAD>1.2 DIV8Title 2</HEAD>
         <P>(a) text 1 </P>
         <P>(ii) text 2 </P>
         <P>(2) text 2.1 </P>
      </DIV8>

      <DIV8 N="1.3" TYPE="SECTION">
         <HEAD>1.3 DIV8 Title 3</HEAD>
         <P> (ff) text 1 </P>
      </DIV8>
   </DIV7>
   <DIV6 N="A" TYPE="SUBPART">
      <HEAD>Subpart A: DIV6Title 1 </HEAD>
      <DIV7 N="2" TYPE="SUB">
         <HEAD>2 DIV7Title 2</HEAD>
         <DIV8 N="2.1" TYPE="SECTION">
            <HEAD>2.1 DIV8Title 1 </HEAD>
            <P>(a) text 1</P>
            <P>(b) text 2 </P>
            <P>(c) text 3</P>
         </DIV8>

         <DIV8 N="2.2" TYPE="SECTION">
            <HEAD>2.2 DIV8 Title2</HEAD>
            <P> (o) text</P>
         </DIV8>
      </DIV7>
      <DIV7 N="3" TYPE="SUB">
         <HEAD>3. DIV7 Title 3</HEAD>
         <DIV8 N="3.1" TYPE="SECTION">
            <HEAD>3.1 DIV8 Title 1</HEAD>
            <P>(r) text 1</P>
            <P>(s) text 2</P>
         </DIV8>
      </DIV7>
   </DIV6>
   <DIV6 N="B" TYPE="SUBPART">
      <HEAD>Subpart B: DIV6 Title 2</HEAD>
         <DIV8 N="12" TYPE="SECTION">
            <HEAD>12. DIV8 Title 1</HEAD>
            <P>7(a) text </P>
         </DIV8>
   </DIV6>
</DIV5>
'''

我有以下代码:

import lxml.etree as ElementTree

tree = ElementTree.ElementTree(ElementTree.fromstring(txt))
root = tree.getroot()

sub_parts = root.findall(".//DIV6")

for sub in sub_parts:
   l2_title = subpart.find('.//HEAD').text
   .
   .# Unsure what to do after this part
   .

我遇到的问题:

  1. DIV5的孩子是

    [HEAD, AUTH, SOURCE, DIV7, DIV6, DIV6]
    上面的代码似乎只抓取 DIV6 及其子项。代码 完全跳过他们的 DIV7 兄弟姐妹及其孩子。 我怎样才能同时解析两者?

  2. 使用 ElementTree 获得以下结果的最佳方法是什么?

理想的结果:

L2Ci L2标题 L3Ci L3标题 L4Ci L4标题 L5Ci L5标题 L6Ci L6标题
1. DIV7标题 1 1.1 DIV8标题 1 (1) 课文 1
1. DIV7标题 1 1.2 DIV8标题 2 (一) 正文 1
1. DIV7标题 1 1.2 DIV8标题 2 (二) 文字2
1. DIV7标题 1 1.2 DIV8标题 2 (二) 文字2 (2) 正文 2.1
1. DIV7标题 1 1.3 DIV8标题 3 (ff) 正文 1
A DIV6标题 1 2. DIV7标题 2 2.1 DIV8标题 1 (一) 正文 1
A DIV6标题 1 2. DIV7标题 2 2.1 DIV8标题 1 (二) 文字2
A DIV6标题 1 2. DIV7标题 2 2.1 DIV8标题 1 (三) 正文 3
A DIV6标题 1 2. DIV7标题 2 2.2 DIV8标题 2 (o) 正文 1
A DIV6标题 1 3. DIV7标题 3 3.1 DIV8标题 3 (右) 正文 1
A DIV6标题 1 3. DIV7标题 3 3.1 DIV8标题 3 (小) 文字2
DIV6标题 2 12 DIV8标题 1 (一) 文字

谢谢!

python pandas xml web-scraping elementtree
© www.soinside.com 2019 - 2024. All rights reserved.