这是我的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"
答案 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
标记)并获取以下文本兄弟。
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