【问题标题】:XML Not Well-FormedXML 格式不正确
【发布时间】:2019-04-29 05:39:36
【问题描述】:

我正在尝试根据获取请求从网页中抓取一些数据。不久前我有一个类似的问题,用户能够向我展示如何解析 XML 响应。我开始使用相同的策略,但出现“格式不正确”的错误。我已经搜索了解决方法或解决方案,但我并没有真正到达任何地方。任何帮助将不胜感激!

我的代码如下:

import requests
from xml.etree import ElementTree as ET
import json

base_url = "https://www.gmeiutility.org/actions/Search/?isPendingValidationChecked=true&isSearchAllLOUChecked=true&keyWord=5493&page=1&resultsPerPage=15&searchType=baseSearch&sortDirection=&sortFieldName="
r = requests.get(base_url)
print(r.content)


root = ET.fromstring(r.content)
data = json.loads(root.text)

for result in data['entitySearchResult']:
    print(result['LEINumber'])

【问题讨论】:

  • 我的错误如下所示:xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

标签: python xml web-scraping python-requests


【解决方案1】:

跳过root = ET.fromstring(r.content)。并不需要。直接进入'json.loads'

import requests 
import json

base_url = "https://www.gmeiutility.org/actions/Search/?isPendingValidationChecked=true&isSearchAllLOUChecked=true&keyWord=5493&page=1&resultsPerPage=15&searchType=baseSearch&sortDirection=&sortFieldName=" 
r = requests.get(base_url) 
#print(r.content)

data = json.loads(r.content)

for result in data['entitySearchResult']: 
    print(result['LEINumber'])

我得到了输出:

549300FTQBLOETQK6X43
549300UQLV7M883Z2X56
5493003MO7QE8VJUEP94
549300GKNMWK6EJZWB62
...

编辑:如果有人想进一步扩展/澄清,请随意。我下面的解释可能并不完全准确(而且解释很差),因为我还在学习,但我认为这与 xml 如何使用requests.get() 构造有关。

我所做的是,我查看了您的 r.content,它看起来已经是类似 json 的结构,所以我想立即尝试 json.loads(r.content)

进一步研究,如果您查看您之前发布的帖子/问题(如上所述),当您 print (r.content) 时,您会看到:

b'<?xml version="1.0" encoding="utf-8"?>\r\n<string xmlns="http://tempuri.org/">{"Result":[{"Appl_Number":"20181458","Seq_Num":"28","Inst_Rle_Cde":"1","Appl_Type":"BRANCH","Appl_Recd_YMD":"11/1/2018 12:00:00...

注意它以b'&lt;?xml version="1.0" encoding="utf-8"?&gt;\r\n 开头,因此在您的第一篇文章中使用root = ET.fromstring(r.content),然后查看root.text,似乎可以将其转换为您在此处的request.get()

当你在这里执行print (r.content) 时,我明白了:

b'{"totalPages":28085,"totalResults":421274,"lastResult":15,"entitySearchResult":[{"isPendingReview":"false","headquartersAddressLineOne":

缺少&lt;?xml version="1.0"...&gt; 所以我认为这就是你得到那个错误的原因,因为它在得到root = ET.fromstring(r.content) 时正在寻找&lt;?xml version="1.0"...&gt; 所以它无法转换它(或者实际上,都准备好使用json.loads() 之前没有进行转换。

就像我说过的,我也在学习,所以我会做更多的研究来研究这个以及 XML 是如何工作的。尽管如此,这是一个很好的起点,可以进行研究、玩耍和学习。

【讨论】:

  • 非常感谢。为什么不需要“根”部分?
  • 检查上面的编辑。基本上,我认为它已经是所需的格式。不需要转换为“根”。我的建议是,看看你问过的上一篇文章中的内容,并将其与这篇文章进行比较(这就是我所做的)。
  • 这是有道理的。我确实比较了我的问题之间的两个输出并注意到了这一点。我对此很陌生,所以我不太清楚在挖掘数据方面的差异意味着什么。再次感谢,感谢您的帮助。
  • 我同意你的观点,在网络抓取方面也很新(尤其是 xml),但我认为这很有趣。我一直在工作/学习主要是解析 html 和 json,所以这是一个很好的体验,可以稍微了解一下 xml。只要不断练习,不断学习。它变得更容易了。
  • 谢谢,是的,我玩得很开心,很有收获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多