【问题标题】:how to use lxml to get the url如何使用lxml获取url
【发布时间】:2015-02-22 05:42:17
【问题描述】:

我想知道如何使用lxml获取一个url,然后我可以使用xpath来解析我想要的数据。
请指导我,非常感谢。

res = requests.get('http://www.ipeen.com.tw/comment/778246')
doc = parse(res.content)
name = doc.xpath("//meta[@itemprop='name']/@content")               
print name

我的代码有错误:

   doc = parse(res.content)
  File "/Users/ome/djangoenv/lib/python2.7/site-packages/lxml/html/__init__.py", line 786, in parse
    return etree.parse(filename_or_url, parser, base_url=base_url, **kw)
  File "lxml.etree.pyx", line 3299, in lxml.etree.parse (src/lxml/lxml.etree.c:72655)
  File "parser.pxi", line 1791, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:106263)
  File "parser.pxi", line 1817, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:106564)
  File "parser.pxi", line 1721, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:105561)
  File "parser.pxi", line 1122, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:100456)
  File "parser.pxi", line 580, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:94543)
  File "parser.pxi", line 690, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:96003)
  File "parser.pxi", line 618, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:95015)
IOError

【问题讨论】:

    标签: python html lxml


    【解决方案1】:

    res.content 是一个字符串,一个 HTML 字符串。

    你需要使用lxml.html.fromstring():

    import lxml.html
    import requests
    
    res = requests.get('http://www.ipeen.com.tw/comment/778246')
    
    doc = lxml.html.fromstring(res.content)
    name = doc.xpath(".//meta[@itemprop='name']/@content")   
    print name     
    

    【讨论】:

    • 谢谢,这是用 html 格式解析 url 的正常方法吗?我习惯用scrapy,我只是给蜘蛛链接,然后我可以使用xpath。
    • @user2492364 是的,如果是requests,这是一种正常的方式。如果您使用urllib2,那么您可以使用lxml.html.parse(urllib2.urlopen(url)),因为urlopen() 返回一个类似文件的对象。
    • @user2492364 仅供参考,您的 xpath 会返回一个空列表,因为页面上没有真正具有 itemprop="name" 属性的 meta 标记。
    • 非常感谢!我可以继续前进了
    【解决方案2】:

    大概res.content 是一个包含页面内容的字符串。 parse 采用文件名或类似文件的对象。因此,您使用页面内容作为文件名。这可能不是你想要的。要从字符串构造树,请使用fromstring 而不是parse

    【讨论】:

    • 与 lxml 一样,有两个主要的库 etree 和 html 用于 xml 处理。 @alecxe 显示了 html,而您正在讲述 etree,即 etree.parse----是吗?
    • @SIslam:我想如果你处理 HTML,你会使用lxml.html,如果你处理 XML,你会使用lxml.etree。我猜我的意思是lxml.etree,因为这就是问题所在,但这是一个有争议的问题,因为你只是以一种或另一种方式更改 5 个字母。
    • ,lxml.html.parse 怎么样,虽然它不处理碎片文档。
    • 我认为如果 xml 不是碎片化的,那么 lxml.html.parse 可能会被使用。但是它是另一种选择?
    • @fragment 是我认为的损坏页面。如果是 html,文档是整页-我认为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2015-06-13
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多