【问题标题】:how to extract reviews from iframeurl returned by amazon api in python?如何从 python 中亚马逊 api 返回的 iframeurl 中提取评论?
【发布时间】:2014-01-27 19:11:31
【问题描述】:

我正在尝试使用api 获取amazon 中给定产品的评论text 内容。但我无法解决。 这是我所拥有的:

result = api.item_lookup('B00062B6QY', ResponseGroup='Reviews',
     TruncateReviewsAt=256, IncludeReviewsSummary=False)
iframeurl=result.xpath('//*[local-name()="IFrameURL"]/text()')[0].strip()
print iframeurl
reviews=requests.get(iframeurl)
reviews.raise_for_status()
#data = json.loads(reviews.text)
root = ET.fromstring(reviews.text)
print root

输出是:

http://www.amazon.com/reviews/iframe?akid=helloworld&alinkCode=xm2&asin=B00062B6QY&atag=welcomehome-20&exp=2014-01-28T19%3A06%3A20Z&summary=0&truncate=256&v=2&sig=HIDDEN%3D
Traceback (most recent call last):
  File "amazon_api_new.py", line 36, in <module>
    root = ET.fromstring(reviews.text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1300, in XML
    parser.feed(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1642, in feed
    self._raiseerror(v)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
    raise err
xml.etree.ElementTree.ParseError: mismatched tag: line 867, column 2

PS:我更改了打印出来的iframeurl,只是为了清除api key的详细信息

编辑:来自firebug的图片

【问题讨论】:

  • 更好地打印并将reviews.text添加到问题中
  • print reviews.text 给你什么?
  • @Guy 它提供了一个像对象一样的巨大 html 文件
  • with open('out.html', 'w') as f: f.write(reviews.text) 并在文本编辑器中打开它以查看第 867 行中的内容或使用浏览器,然后打开 firebug...
  • @Guy 我从 firebug 上传了一张图片

标签: python iframe xpath amazon-web-services


【解决方案1】:

不要使用 ElementTree,而是尝试将reviews.text 加载到lxml,例如:

>>> from lxml import etree
>>> parser = etree.HTMLParser()
>>> tree   = etree.parse(StringIO(reviews.text), parser)

>>> result = etree.tostring(tree.getroot(),
...                         pretty_print=True, method="html")
>>> print(result)
...

当然,然后你可以使用lxml xpath进行进一步解析

【讨论】:

  • 就我而言:我会使用上面的 broken_html="out.html" ,对吗?
  • 那么不需要创建文件,只需加载html到解析器,看我的更新
  • 我应该为StringIO导入什么
  • 我想只是from StringIO import StringIO
  • 正在打印html,和上一个类似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 2012-04-27
  • 2020-07-07
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多