Python XPath不是;“看见”;img元素?

Python XPath不是;“看见”;img元素?,python,html,xpath,web-scraping,html-parsing,Python,Html,Xpath,Web Scraping,Html Parsing,以下是我的html代码: <div style="font-size: 14px;"> <img src="somelink.com">"TEXT"<br> 但它似乎没有将“文本”指定给storedText 编辑:我想添加一些html代码片段,它们不包含img元素,但包含我不想获取的文本 <div style="font-size: 14px;"> "TEXT I DONT WANT" “我不想要文本” img元素没有包含文本

以下是我的html代码:

<div style="font-size: 14px;">
    <img src="somelink.com">"TEXT"<br>
但它似乎没有将“文本”指定给storedText

编辑:我想添加一些html代码片段,它们不包含img元素,但包含我不想获取的文本

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

“我不想要文本”

img
元素没有包含文本。它们是自我完善的。因此,文本实际上是上面
div
的一部分。取而代之的是抓取它的文本

换言之:

storedText = tree.xpath('//div/text()')
正如@alecxe所指出的,基于精确样式对div进行限定是一种极其脆弱的模式。但是,如果您想将该条件或其他条件添加回XPath表达式中,请随意

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


根据新信息更新
lxml.html
是解析库:lxml与纯XML库使用纯XPath的方式不同。相反,它是XPath和etree(ElementTree)API的结合,这是许多Python XML/HTML解析库所共有的,附带了一些自己的基本方法

因此,您不应该直接搜索
/text()
节点。您应该使用元素特有的
text\u 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()
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还是多个这样的节点,都会返回一个适当的值。

方法是依赖团队图标(
img
标记)的位置,并获得以下文本同级

使用和完成代码:

印刷品:

LDLC
fnatic

Natus Vincere
Titan

HellRaisers
ALTERNATE

myXMG
Flipsid3

依赖元素的
style
属性看起来不太可靠。你能展示更多你正在处理的HTML代码吗?(或网站链接)。谢谢。您使用的是哪个xml包?lxml、ElementTree、beautifulsoup。。。等等。试着打印
div
元素,看看html解析器是如何构建文档的。它因包而异,但如果它的lxml的html解析器是
lxml.html.tostring(tree.xpath('//div[@style=“font-size:14px;“]”)[0]
@alecxe此处是站点:,我只想在团队名称旁边有图片(标志)时获取团队名称。它的html正在用lxml解析
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