我正在抓一些韩语文本,因为缺少一个更好的词,我遇到了很多“链接感叹词”,其中html看起来像这样......
<a href="path" title="저">는</a> 좋아요
它将'저'显示为超链接,但将'는좋아요'显示为常规文本。它们实际上是同一个单词对象的一部分,并在页面上显示为“저는좋아요요”,但在使用此xpath和regex进行刮擦时...
foo = response.xpath('//*[@id="divID"]/p//text()').re(ur'[\uac00-\ud7af]+')
它在列表中被分成两个单词......
foo == ['저', '는', '좋아요']
我怎样才能将它作为一个单词保留,就像我最初的意图一样?
intended: foo == ['좋는', '좋아요']
编辑:(评论回复)
<。> .join()的问题在于它会加入所有经常被删除的单词以及我所知道的。所以我最终会得到这个......''.join(foo) == ['좋는좋아요']
所以我不认为.join()会起作用,除非有我遗漏的东西
答案 0 :(得分:2)
如果您想处理HTML元素的字符串表示形式,XPath的string()
function可能会非常有用。
一旦元素有一个字符串,就可以为单词应用正则表达式。
这是一个示例python解释器会话(我必须稍微更改您的标记以匹配您显示的结果):
>>> import scrapy
>>>
>>> response = scrapy.Selector(text=u'<p><a href="path" title="저">저</a>는 좋아요</p>')
.//text()
将选择所有后代文本节点,作为.extract()
时的单个字符串(在这种情况下为2个字符串):
>>> response.xpath('.//p//text()').extract()
[u'\uc800', u'\ub294 \uc88b\uc544\uc694']
使用正则表达式,你会找到1个单词,然后是2个单词:
>>> response.xpath('.//p//text()').re(ur'[\uac00-\ud7af]+')
[u'\uc800', u'\ub294', u'\uc88b\uc544\uc694']
>>> for e in response.xpath('.//p//text()').re(ur'[\uac00-\ud7af]+'):
... print e
...
저
는
좋아요
如果在段落元素上使用XPath string()
函数,则会得到一个字符串,即使该元素还有其他子句,如a
:
>>> response.xpath('string(.//p)').extract()
[u'\uc800\ub294 \uc88b\uc544\uc694']
>>> print response.xpath('string(.//p)').extract_first()
저는 좋아요
然后,您可以应用正则表达式来分割单词:
>>> response.xpath('string(.//p)').re(ur'[\uac00-\ud7af]+')
[u'\uc800\ub294', u'\uc88b\uc544\uc694']
>>> for e in response.xpath('string(.//p)').re(ur'[\uac00-\ud7af]+'):
... print e
...
저는
좋아요
请注意,string(node-set)
仅考虑作为参数传递的节点集中的第一个元素,因此请确保您的XPath表达式首先匹配您想要的元素,或者您还可以使用scrapy选择器链接XPath表达式: / p>
>>> for e in response.xpath('.//p').xpath('string(.)').re(ur'[\uac00-\ud7af]+'):
... print e
...
저는
좋아요