Scrapy提取元素文本用"<"符号?

时间:2014-09-15 13:31:25

标签: xpath scrapy

我正在抓取一个包含温度数据且字段包含"<"和">"用于描述环境温度的符号。这些都没有在HTML中编码,因此当我使用选择器提取它们时,元素文本在符号处被截断。正如人们所料,这只是"<"符号。关于如何解决这个问题的想法?我将抓取的数据作为JSON发布到我的API - 如果这使问题复杂化。代码:

t = temps.xpath('td[@class="temperature_am"]//p/text()').extract()

HTML:

<p>Temperatures are normal (< 4 degrees C / 40 degrees F).</p>

非常感谢!

2 个答案:

答案 0 :(得分:1)

我看到的唯一解决方法是在将Html加载到HtmlDocument之前清理它。

var html = @"<html><body><table><tr><td class=""temperature_am""><p>Temperatures are normal (< 4 degrees C / 40 degrees F).</p></td><tr></table></body></html>";
var cleanedHtml = html.Replace("(<", HttpUtility.HtmlEncode("(<"));
var doc = new HtmlDocument();
doc.LoadHtml(cleanedHtml);
var innerText = doc.DocumentNode.SelectSingleNode(@"//td[@class='temperature_am']")
                                .ChildNodes
                                .First(s => s.Name == "p")
                                .InnerText;
var text = httpUtility.HtmlDecode(innerText);

Assert.Equal("Temperatures are normal (< 4 degrees C / 40 degrees F).", text);

答案 1 :(得分:0)

以klettier的答案为基础:在输入HTML中将"< "替换为"&lt; "(请注意每个中的空格)。

var cleanedHtml = html.Replace("< ", HttpUtility.HtmlEncode("< "));

在我运行的快速测试中,三个主要浏览器(Firefox,Chrome和Safari)都将<作为文字处理,后面跟着一个空格(即使该空格后跟一个元素名称,例如a)。因此,即使HTML规范说作者&#34;应该&#34;所以你会抓住这个自由的网页会有一些意义。使用&lt;代替<。 但我有点惊讶的是,scrapy并没有遵循与那些浏览器相同的惯例。

根据HTML language reference,实际元素开头或结尾标记开头的<不能立即跟一个空格。