【问题标题】:Get <img>'s title-attribute with lxml in Python在 Python 中使用 lxml 获取 <img> 的标题属性
【发布时间】:2011-10-01 11:26:26
【问题描述】:

我想使用 Python 从this 网站中提取 one-iner-texts。 HTML 中的消息如下所示:

<div class="olh_message"> 
    <p>foobarbaz <img src="/static/emoticons/support-our-fruits.gif" title=":necta:" /></p> 
</div> 

到目前为止,我的代码如下所示:

import lxml.html
url = "http://www.scenemusic.net/demovibes/oneliner/"
xpath = "//div[@class='olh_message']/p"
tree = lxml.html.parse(url)
texts = tree.xpath(xpath)
texts = [text.text_content() for text in texts]
print(texts)

然而,现在我只得到foobarbaz,但我也想在其中得到img的标题参数,所以在这个例子中foobarbaz :necta:。看来我需要 lxml 的 DOM 解析器来做到这一点,但我不知道怎么做。谁能给我一个提示?

提前致谢!

【问题讨论】:

    标签: python dom xpath html-parsing lxml


    【解决方案1】:

    试试这个

      import lxml.html
      url = "http://www.scenemusic.net/demovibes/oneliner/"
      parser = lxml.etree.HTMLParser()
      tree = lxml.etree.parse(url, parser)
      texts = tree.xpath("//div[@class='olh_message']/p/img/@title")
    

    【讨论】:

    • 谢谢,但是我想要包含标题属性的文本(如foo &lt;img title="bar"&gt;...&lt;/img&gt; baz -> foo bar baz
    • 我告诉你的 xpath + 你最初发布的 xpath 不能完成这项工作?
    • 让我试着澄清一下:我希望在我的示例中获得文本,并在正确的位置添加表情符号。因此,例如,如果我有这个 HTML:paste,我想得到这个最终结果:['one :) two :D three', 'blah bluh blah']
    • 抱歉发了双重帖子...换句话说,你可以说我想用它的标题属性替换 //div[@class='olh_message']/p 中的每个 img-node。
    • @The Compiler:当你想澄清你在问什么时,请通过编辑问题来做到这一点。
    【解决方案2】:

    使用

    //div[@class='olh_message']/p/node()
    

    他选择任何p 元素的所有子节点(元素、文本节点、PI 和评论节点),该元素是任何div 元素的子节点,其class 属性为'olh_message'

    使用 XSLT 作为 XPath 的宿主进行验证

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="/">
         <xsl:copy-of select="//div[@class='olh_message']/p/node()"/>
     </xsl:template>
    </xsl:stylesheet>
    

    当此转换应用于以下 XML 文档时

    <div class="olh_message">
        <p>foobarbaz 
            <img src="/static/emoticons/support-our-fruits.gif" title=":necta:" />
        </p>
    </div>
    

    产生了想要的、正确的结果(表明 XPath 表达式已经准确地选择了想要的节点):

    foobarbaz 
            <img src="/static/emoticons/support-our-fruits.gif" title=":necta:"/>
    

    【讨论】:

    • 谢谢,但这并不是我真正想要的。看我上一个答案的cmets,这应该说清楚了。
    • @The Compiler:你必须编辑你的问题:这改变了它的含义,使它成为一个新的、非常不同的问题。对于 current 问题,我的回答提供了准确和正确的解决方案。此外,如果您要问第二个问题,那么不与回答第一个问题的人一起玩并将他们的答案降级为无是唯一的票价和逻辑。您的第二个问题很容易回答(尽管它不仅需要 XPath),但我不愿意删除我对第一个问题的回答,因为它对人们也很有价值。我怎么知道你不会再改问题了?
    • 不,它不会改变问题,你只是误解了它。问题清楚地表明输出应包含img 标签的title“参数”(“属性”会更准确,但它非常明显),甚至提供了仅包含:necta: 的预期输出没有img 元素。您的答案仍然部分有效,只是不完整。你只需要输出属性的值,例如`concat(//div[@class='olh_message']/p/text(),//div[@class='olh_message']/p/img/ @title)'。
    • @Flynn1179:我的回答正是 OP 所说的——在他对@user835846 的第一条评论中。任何以这种方式“演变”的问题都不会有“正确”的答案。
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多