无法使用Scrapy从父节点和子节点/标记中获取文本



在这被标记为重复之前,我已经搜索并尝试了在SO上找到的其他解决方案,它们是:

  1. scrapy css选择器:获取所有内部标记的文本
  2. 如果文本是Scrapy中其他节点的父节点,如何使用XPath从子节点获取文本
  3. scratch获取包括儿童在内的全部文本

我想从中提取的HTML是:

<span class="location">
Mandarin Oriental Hotel
<a class="" href="/search-results/Jalan+Pinang%252C+Kuala+Lumpur+City+Centre%252C+50088+Kuala+Lumpur%252C+Wilayah+Persekutuan./?state=Kuala+Lumpur" itemprop="addressRegion" title="Jalan Pinang, Kuala Lumpur City Centre, 50088 Kuala Lumpur, Wilayah Persekutuan.">
Jalan Pinang, Kuala Lumpur City Centre, 50088 Kuala Lumpur, Wilayah Persekutuan.
</a>
,
<a class="" href="/search-results/?neighbourhood=Kuala+Lumpur&state=Kuala+Lumpur" title="Kuala Lumpur">
Kuala Lumpur
</a>
,
<a class="" href="/search-results/?state=Kuala+Lumpur" title="Kuala Lumpur">
Kuala Lumpur
</a>
<span class="" itemprop="postalCode">
50088
</span>
</span>

我想获取//span[@class='location']中的所有文本。

我试过:

  1. response.xpath("//span[@class='location']//text()").extract_first()
  2. response.css("span.location *::text").extract_first()
  3. response.css("span.location ::text").extract_first()

它们都只返回Mandarin Oriental Hotel,而不是完整地址。

编辑:文本应产生

吉隆坡市中心Jalan Pinang文华东方酒店,邮编:50088。,吉隆坡,吉隆坡50088

尝试使用以下代码获取每个地址为的span的字符串表示

for entry in response.xpath("//div[@class='entry']"):
print(entry.xpath("normalize-space(./span[@class='location'])").extract_first())

使用response.css("span.location ::text").extract_first(),您只能获得第一个文本,因此您可以尝试调用response.css("span.location ::text").extract(),然后将其连接。

您也可以尝试获取整个父元素并从中删除标记:

from w3lib.html import remove_tags
data = response.css('span.location').get()
if not data:
return
result = remove_tags(data)

最新更新