刮板给空白输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刮板给空白输出相关的知识,希望对你有一定的参考价值。

我在我的python脚本中使用了一个选择器来从下面给出的一些html元素中获取文本。我尝试用.text从元素中获取Shop here cheap字符串,但它根本不起作用。但是,当我尝试使用.text_content()时,它可以正常工作。

我的问题是:

.text方法有什么问题?为什么它不能解析元素中的文本?

Html元素:

<div class="Price__container">
    <span class="ProductPrice" itemprop="price">$6.35</span>
    <span class="ProductPrice_original">$6.70</span>
    Shop here cheap
</div>

我试过的:

from lxml import html

tree = html.fromstring(element)
for data in tree.cssselect(".Price__container"):      
    print(data.text)           #It doesn't work at all

顺便说一句,我不想​​继续使用.text_content(),这就是为什么我期待任何答案来使用.text代替文本。提前致谢。

答案

我认为混淆的根本原因是lxml有这个代表节点内容的.text&.tail concept,它避免了必须有一个特殊的“文本”节点实体,引用documentation

两个属性.text和.tail足以表示XML文档中的任何文本内容。这样,除了Element类之外,ElementTree API不需要任何特殊的文本节点,这些节点往往会相当频繁(正如您可能从经典DOM API中获知)。

在您的情况下,Shop here cheap<span class="ProductPrice_original">$6.70</span>元素的尾部,因此不包含在父节点的.text值中。

除了.text_content()之外的其他方法,您可以通过非递归获取所有顶级文本节点来达到尾部:

print(''.join(data.xpath("./text()")).strip())

或者,获取最后一个顶级文本节点:

print(data.xpath("./text()[last()]")[0].strip())
另一答案

另一种方法可能是打击:

content="""
<div class="Price__container">
    <span class="ProductPrice" itemprop="price">$6.35</span>
    <span class="ProductPrice_original">$6.70</span>
    Shop here cheap
</div>
"""
from lxml import html

tree = html.fromstring(content)
for data in tree.cssselect(".Price__container"):
    for item in data:item.drop_tree()
    print(data.text.strip())

输出:

Shop here cheap

以上是关于刮板给空白输出的主要内容,如果未能解决你的问题,请参考以下文章

片段中的Android webView显示空白页面

如何修复空白片段?

python: 带有 BeautifulSoup 的 Google 搜索刮板

如何从RegEx分组中“排除”空白区域?

片段布局为空白

Node.js 刮板中的内存泄漏