XPath看不到img元素?

0 投票
2 回答
733 浏览
提问于 2025-04-28 21:13

这是我的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

补充说明:我想说的是,有些HTML片段没有包含图片元素,但有一些我不想获取的文本。

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

2 个回答

1

img元素本身不包含文本,它们是自给自足的。所以,文本实际上是上面那个div的一部分。你应该获取它的文本。

换句话说:

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

正如@alecxe所提到的,基于精确样式来限定div是一种非常脆弱的做法。但如果你想在XPath表达式中添加这些或其他条件,随意就好。

另外,我假设你使用的XPath实现能够处理HTML的各种变化?有些可以,有些不行。不过,你那段标记虽然在HTML中没问题,但在XML中是不合法的。如果你的解析器和XPath组合能处理这个,那就没问题。否则,你会因此遇到各种麻烦。


更新 根据新信息,lxml.html是解析库:LXML并不像纯XML库那样使用纯XPath。相反,它是XPath和etree(ElementTree)API的结合,这种API在很多Python的XML/HTML解析库中都很常见,并且还加入了一些自己独特的方法。

因此,你不应该直接搜索./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个还是多个这样的节点,都会返回一个合适的值。

1

这个想法是根据团队图标的位置(也就是 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

撰写回答