21

我有这个代码

   site = hxs.select("//h1[@class='state']")
   log.msg(str(site[0].extract()),level=log.ERROR)

输出是

 [scrapy] ERROR: <h1 class="state"><strong>
            1</strong>
            <span> job containing <strong>php</strong> in <strong>region</strong> paying  <strong>$30-40k per year</strong></span>
                </h1>

是否可以只获取没有任何 html 标签的文本

4

5 回答 5

57
//h1[@class='state']

在您上面的 xpath 中,您正在选择h1具有class属性的标签state

所以这就是为什么它选择所有进来的东西h1 element

如果您只想选择h1标签的文本,您所要做的就是

//h1[@class='state']/text()

如果要选择h1标签的文本及其子标签,则必须使用

//h1[@class='state']//text()

所以区别在于/text()特定标签文本和特定标签//text()的文本及其子标签

下面提到的代码适合你

site = ''.join(hxs.select("//h1[@class='state']/text()").extract()).strip()
于 2012-11-21T10:00:44.917 回答
3

您可以使用 BeautifulSoupget_text()功能。

from bs4 import BeautifulSoup

text = '''
<td><a href="http://www.fakewebsite.com">Please can you strip me?</a>
<br/><a href="http://www.fakewebsite.com">I am waiting....</a>
</td>
'''
soup = BeautifulSoup(text)

print(soup.get_text())
于 2015-12-30T14:57:36.977 回答
1

我没有运行一个scrapy实例,所以我无法测试它;但您可以尝试text()在搜索表达式中使用。

例如:

site = hxs.select("//h1[@class='state']/text()")

(从 得到它tutorial

于 2012-11-21T09:22:34.163 回答
1

你可以使用BeautifulSoup去除 html 标签,这里是一个例子:

from BeautifulSoup import BeautifulSoup
''.join(BeautifulSoup(str(site[0].extract())).findAll(text=True))

然后,您可以去除所有额外的空格、新行等。

如果您不想使用其他模块,可以尝试简单的正则表达式:

# replace html tags with ' '
text = re.sub(r'<[^>]*?>', ' ', str(site[0].extract()))
于 2012-11-21T09:28:32.283 回答
0

您可以使用html2text

import html2text
converter = html2text.HTML2Text()
print converter.handle("<div>Please!!!<span>remove me</span></div>")
于 2015-12-30T14:50:16.353 回答