我正在抓取一个包含温度数据且字段包含"<"和">"用于描述环境温度的符号。这些都没有在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>
非常感谢!
答案 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中将"< "
替换为"< "
(请注意每个中的空格)。
var cleanedHtml = html.Replace("< ", HttpUtility.HtmlEncode("< "));
在我运行的快速测试中,三个主要浏览器(Firefox,Chrome和Safari)都将<
作为文字处理,后面跟着一个空格(即使该空格后跟一个元素名称,例如a
)。因此,即使HTML规范说作者&#34;应该&#34;所以你会抓住这个自由的网页会有一些意义。使用<
代替<
。
但我有点惊讶的是,scrapy并没有遵循与那些浏览器相同的惯例。
根据HTML language reference,实际元素开头或结尾标记开头的<
不能立即跟一个空格。