XPath看不到img元素?
这是我的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
标签)来获取它后面的文本。
下面是完整的代码,使用了 requests
和 lxml.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