【问题标题】:extracting attributes from html with lxml使用lxml从html中提取属性
【发布时间】:2015-01-20 02:56:06
【问题描述】:

我使用lxml 从 html 页面中检索标签的属性。 html页面的格式如下:

<div class="my_div">
    <a href="/foobar">
        <img src="my_img.png">
    </a>
</div>

我用来检索&lt;a&gt;标签内的url和同一&lt;img&gt;标签内src值的python脚本是这样的:

from lxml import html 

...
tree = html.fromstring(page.text)
for element in tree.xpath('//div[contains(@class, "my_div")]//a'):
    href = element.xpath('/@href')
    src = element.xpath('//img/@src')

为什么我没有得到字符串?

【问题讨论】:

    标签: python html lxml


    【解决方案1】:

    如果您将代码更改为:

    from lxml import html 
    
    ...
    tree = html.fromstring(page.text)
    for element in tree.xpath('//div[contains(@class, "my_div")]//a'):
        href = element.items()[0][1]  #gives you the value corresponding to the key "href"
        src = element.xpath('//img/@src')[0]
        print(href, src)
    

    你会得到你需要的。

    documentation of lxml 提到了其中一些东西,但我觉得它缺少一些东西,您可能需要考虑使用交互式 python shell 来研究tree.xpath() 返回的实例的属性。或者您可以完全查看另一个解析器,例如 BeautifulSoup,它有非常好的示例和文档。只是分享...

    【讨论】:

    • 我同意和不同意,lxml 可能不是 xpath 处理的最佳选择,但最重要的是,它是一个非常易于使用、快速且强大的 html/xml 解析器。 BeautifulSoup 本身没有解析器,它使用 Python 标准库(比 lxml 慢),但可以配置为使用像 这样的第 3 方lxml,甚至他们的文档也建议安装 lxml 以提高速度。但我确实同意 BeautifulSoup 有很好的文档记录且易于学习。
    • @Anzel,我同意你所说的一切。确实,BeautifulSoup 提到 lxml 是一个快速库,不容忽视。只是文档,通常是示例的最佳来源,在图书馆被社区采用方面发挥了重要作用。以防万一:BeautifulSoup 标记的问题与那些标记为 lxml 的问题的数量(~2/1)。
    【解决方案2】:

    您没有得到想要的结果的原因是因为您试图从 NEXT 子节点而不是现有节点获取属性。

    看这个:

    from lxml import html
    
    s = '''<div class="my_div">
        <a href="/foobar">
            <img src="my_img.png">
        </a>
    </div>'''
    
    tree = html.fromstring(s)
    
    # when you do path... //a, you are ALREADY at 'a' node
    for el in tree.xpath('//div[contains(@class, "my_div")]//a'):
        # you were trying to get next children /@href, which doesn't exist
        print el.xpath('@href') # you should instead access the existing node's 
        print el.xpath('img/@src') # same here, not /img/@src ...
    
    ['/foobar']
    ['my_img.png']
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您正在使用 lxml,因此您正在使用 lxml 对象 - HtmlElement 实例。 HtmlElement 嵌套在 etree.Element:http://lxml.de/api/lxml.etree._Element-class.html, 它有 get 方法,返回属性值。 所以适合你的方法是:

      from lxml import html 
      
      ...
      tree = html.fromstring(page.text)
      for link_element in tree.xpath('//div[contains(@class, "my_div")]//a'):
          href = link_element.get('href')
          image_element = href.find('img')
          if image_element:
              img_src = image_element.get('src') 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 2013-08-25
        • 2015-10-06
        • 2016-05-11
        • 1970-01-01
        相关资源
        最近更新 更多