处理来自 python 个请求的 XML 数据
Handling XML data from python requests
我正在创建一个简单的网络抓取工具。但是,我在正确处理 XML 数据时遇到问题,具体来说,在创建 xml 元素之后,我发现我的元素不包含任何子节点(我预计会有)。我在这里遗漏了一些明显的东西吗?
我的代码:
import xml.etree.ElementTree as ET
import requests
with requests.session() as s:
s.post(Urllog, data=payload)
x = s.post(Urlcourses, data= formdata)
root = ET.fromstring(x.content)
print(x.content)
几个没有子元素的例子:
>>> root.tag
'contents'
>>>
>>> for child in root:
... print(child.tag) #does not return anything
...
>>>
>>> root[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: child index out of range
>>>
x.content
符合预期,如下:
<?xml version="1.0"?>
<contents><![CDATA[
<!-- Display system announcements -->
<div class="noItems divider">No Institution Announcements have been posted in the last 7 days.</div>
<!-- Display course/org announcements -->
<h3>xxx (S2 2015)</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxx
> Lecture Recordings + Tutorial Sheet</a></li>
</ul>
</div>
<h3>xxx (S2 2015)</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxx
> Tutorials / consultation hours</a></li>
<li><a
href=xxx
> 2014 lectures uploaded</a></li>
</ul>
</div>
<h3>xxx(S2 2015)</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxx
> PASS - Peer Assisted Study Sessions</a></li>
</ul>
</div>
<h3>xxxx</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxxx2_1"
> xxx!</a></li>
<li><a
href=xxx
> Careers for Engineers: A session from Engineers Australia</a></li>
</ul>
</div>
<div class="moduleControlWrapper u_reverseAlign">
<a class="button-6"
href=xxxx
>more announcements...</a>
</div>
]]></contents>
你在 root
中得到的 xml 实际上是正确的,因为如果你检查你的 xml,它有 -
<contents><![CDATA[
它只有一个节点contents
,其余的实际上是CDATA
里面的文本。
您可以使用 root.text
访问它们。此外,它们似乎不是实际的 xml 因为它有一个未关闭的 <div>
标记,您可能需要考虑使用一些 html
解析库来解析该文本,而不是 xml.etree.ElementTree
,也许 BeautifulSoup
.
我正在创建一个简单的网络抓取工具。但是,我在正确处理 XML 数据时遇到问题,具体来说,在创建 xml 元素之后,我发现我的元素不包含任何子节点(我预计会有)。我在这里遗漏了一些明显的东西吗?
我的代码:
import xml.etree.ElementTree as ET
import requests
with requests.session() as s:
s.post(Urllog, data=payload)
x = s.post(Urlcourses, data= formdata)
root = ET.fromstring(x.content)
print(x.content)
几个没有子元素的例子:
>>> root.tag
'contents'
>>>
>>> for child in root:
... print(child.tag) #does not return anything
...
>>>
>>> root[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: child index out of range
>>>
x.content
符合预期,如下:
<?xml version="1.0"?>
<contents><![CDATA[
<!-- Display system announcements -->
<div class="noItems divider">No Institution Announcements have been posted in the last 7 days.</div>
<!-- Display course/org announcements -->
<h3>xxx (S2 2015)</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxx
> Lecture Recordings + Tutorial Sheet</a></li>
</ul>
</div>
<h3>xxx (S2 2015)</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxx
> Tutorials / consultation hours</a></li>
<li><a
href=xxx
> 2014 lectures uploaded</a></li>
</ul>
</div>
<h3>xxx(S2 2015)</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxx
> PASS - Peer Assisted Study Sessions</a></li>
</ul>
</div>
<h3>xxxx</h3>
<div class="courseDataBlock">
<ul>
<li><a
href=xxxx2_1"
> xxx!</a></li>
<li><a
href=xxx
> Careers for Engineers: A session from Engineers Australia</a></li>
</ul>
</div>
<div class="moduleControlWrapper u_reverseAlign">
<a class="button-6"
href=xxxx
>more announcements...</a>
</div>
]]></contents>
你在 root
中得到的 xml 实际上是正确的,因为如果你检查你的 xml,它有 -
<contents><![CDATA[
它只有一个节点contents
,其余的实际上是CDATA
里面的文本。
您可以使用 root.text
访问它们。此外,它们似乎不是实际的 xml 因为它有一个未关闭的 <div>
标记,您可能需要考虑使用一些 html
解析库来解析该文本,而不是 xml.etree.ElementTree
,也许 BeautifulSoup
.