【问题标题】:XPath not "seeing" the img element?XPath 没有“看到” img 元素?
【发布时间】:2014-12-17 03:31:02
【问题描述】:

这是我的html代码:

<div style="font-size: 14px;">
    <img src="somelink.com">"TEXT"<br>

这是我的 xpath:

storedText = tree.xpath('//div[@style="font-size: 14px;"]/img/text()')

但它似乎没有将“TEXT”分配给 storedText

编辑:我想添加一些不包含 img 元素但我不想抓取的文本的 html sn-ps

<div style="font-size: 14px;">
    "TEXT I DONT WANT"

【问题讨论】:

  • 依赖元素的style 属性看起来不太可靠。你能显示更多你正在处理的 HTML 代码吗? (或网站链接)。谢谢。
  • 您使用的是哪个 xml 包? lxml、ElementTree、beautifulsoup...等
  • 尝试打印div 元素以查看您的html 解析器如何构建文档。它因包而异,但如果它的 lxml 的 html 解析器,它将是 lxml.html.tostring(tree.xpath('//div[@style="font-size: 14px;"]')[0]
  • @alecxe 这里是站点:hltv.org/?pageid=2,我只想在团队名称旁边有图片(旗帜)时抓取团队名称。

标签: python html xpath web-scraping html-parsing


【解决方案1】:

img 元素没有包含文本。它们是自我完整的。所以文字实际上是上面div的一部分。取而代之的是它的文本。

换句话说:

storedText = tree.xpath('//div/text()')

正如@alecxe 所说,基于精确样式限定 div 是一种极其脆弱的模式。但是,如果您想将该或其他限定条件添加回 XPath 表达式,请随意。

另外,我假设您使用的 XPath 实现能够适应 HTML 的变迁?有些是,有些不是。但是您的标记 sn-p 虽然对 HTML 很好,但不是有效的 XML。如果您的解析器/XPath 组合很酷,那么您就可以开始了。否则,您将因此而面临各种悲伤。


更新 基于lxml.html 是解析库的新信息:LXML 不像纯XML 库那样使用纯XPath。相反,它是 XPath 和许多 Python XML/HTML 解析库所共有的 etree (ElementTree) API 的结合,并结合了一些自己的朴素方法。

因此,您不应直接搜索./text() 节点。您应该改用元素的特殊 text_content() 方法。例如:

import lxml.html

html = """
<div style="font-size: 14px;">
    <img src="somelink.com">"TEXT"<br>
"""

tree = lxml.html.document_fromstring(html)

div = tree.xpath('//div[@style="font-size: 14px;"]')[0]
storedText = div.text_content()

但是请注意,如果 XPath 搜索未找到元素,[0] 索引将失败,从而引发 IndexError 异常。稍微不那么脆弱的是使用包装器来抽象和处理找不到此类节点的可能性。例如:

def gettext(elist):
    if not elist or elist is None:
        return None
    return ''.join(e.text_content() for e in elist)

storedText = gettext(tree.xpath('//div[@style="font-size: 14px;"]'))
print storedText

对于gettext,无论找到0、1还是多个这样的节点,都会返回一个适当的值。

【讨论】:

  • 它的 HTML 被 lxml 解析
【解决方案2】:

想法是依靠团队图标的位置(img标签)并获取以下文本兄弟

使用requestslxml.html完成代码:

import lxml.html
import requests

url = 'http://www.hltv.org/?pageid=2'
response = requests.get(url)

tree = lxml.html.fromstring(response.content)
for item in tree.xpath('//div[@class="centerNoHeadline"]//div[@class="hotmatchbox"]//div[@class="hotmatchbox"]/div/img/following-sibling::text()'):
    print item.strip()

打印:

LDLC
fnatic

Natus Vincere
Titan

HellRaisers
ALTERNATE

myXMG
Flipsid3

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 2012-10-24
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2015-11-24
    • 2017-11-07
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多