XPath不是"看到" img元素?

时间:2014-10-21 19:23:27

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

这是我的HTML代码:

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

这是我的xpath:

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

但它似乎并没有分配&#34; TEXT&#34;到storedText

编辑:我想补充一下,html片段不包含img元素,但是我不想抓住的文字

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

2 个答案:

答案 0 :(得分:1)

img个元素没有包含文字。他们是自我完成的。所以文本实际上是上面div的一部分。抓住它的文字。

换句话说:

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

正如@alecxe所说,基于精确造型对div进行鉴定是一种极其脆弱的模式。但是如果你想将这个或其他资格添加回XPath表达式,请随意。

另外,我假设你正在使用一个对HTML的变迁感到满意的XPath实现?有些是,有些不是。但是那里的标记片段虽然适用于HTML,但却不是有效的XML。如果您的解析器/ XPath组合很酷,那么您就可以了。否则,你会因此而面临各种悲伤。


更新基于lxml.html是解析库的新信息:LXML不像纯XML库那样使用纯XPath。相反,它是XPath和etree(ElementTree)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 :(得分: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