【问题标题】:Extra characters Extracted with XPath and Python (html)使用 XPath 和 Python (html) 提取的额外字符
【发布时间】:2010-05-27 03:55:02
【问题描述】:

我一直在使用 XPath 和 scrapy 在线从 html 标签中提取文本,但是当我这样做时,我会附加额外的字符。一个示例是尝试从<td> 标签中提取一个数字,例如“204”并获取[u'204']。在某些情况下,情况要糟糕得多。例如,尝试提取“1 - Mathoverflow”而不是得到[u'\r\n\t\t 1 \u2013 MathOverflow\r\n\t\t ']。有没有办法防止这种情况发生,或者修剪字符串以使多余的字符不是字符串的一部分? (使用项目来存储数据)。看起来它与格式有关,所以我如何让 xpath 不拾取那些东西?

【问题讨论】:

  • 如果您能提供一个完整的、自包含的代码示例来重现您的问题,那将会很有帮助。我们正在尝试继续猜测您在做什么。

标签: python html scrapy


【解决方案1】:

返回[u'204'] 的代码行是什么样的?看起来返回的是一个 Python 列表,其中包含一个带有您想要的值的 unicode 字符串。那里什么都没有——只是下标。至于回车、换行和制表符,就像伟业东刚刚回答的那样,strip会去掉。

大概

my_answer = item1['Title'][0].strip()

或者,如果您期待多场比赛

for ans_i in item1['Title']:
    do_something_with( ans_i.strip() )

【讨论】:

  • 好的,谢谢,修复了它,它似乎将1 - MathOverflow 中的破折号作为一个奇怪的字符串\u 2013 拾取,并且ascii 无法读取它。至于 [u'204'],我不知道为什么 xpath 将它放在数据周围。 xpath 语句为//div[@id="content"]/div[@id="directory-list"]/div[@class="wrapper"]/table/tr[@class="odd"][1]/td[1]/text()
  • 我认为您将实际返回的内容与 Python 在提示符处打印时的呈现方式混淆了。当您在屏幕上看到[u'204'] 时,这不是以[ 字符开头的字符串。相反,它是 Python 告诉您它正在向您显示一个包含单个 unicode 字符串的列表对象的方式。该 unicode 字符串中的值是三个字符 204。这正是你想要的。我向您展示的代码应该为您解压。
  • 同样,Python 不会用字符串 \u2013 替换破折号。相反,它只是向您显示已返回的 Unicode 字符串包含代码点 2013 处的字符。希望您知道它不会让您感到惊讶,它是“EN DASH”的代码点。 Python 没有改变字符串,它准确地返回浏览器中的内容。如果你想删除非 ascii 字符,这个最近的帖子会有所帮助:stackoverflow.com/questions/2854230/…
  • 啊,我只是想把这些东西放在 csv 文档中,但遇到了问题。
【解决方案2】:

标准的 XPath 函数 normalize-space() 正是想要的效果。

它会删除前导和尾随空白并仅用一个空格替换任何内部空白。

所以,你可以使用

normalize-space(someExpression)

【讨论】:

  • 啊,好吧,那它的语法是怎样的?是 ('normalize-space(//div[@id="content"]/div[@id="directory-list"]/div[@class="wrapper"]/table') items = []')对吗?
  • @Nacari:这是一个正确的 XPath 表达式:normalize-space(//div[@id="content"]/div[@id="directory-list"]/div[@class="wrapper"]/table)
【解决方案3】:

使用 strip() 删除前导和尾随空格。

>>> u'\r\n\t\t 1 \u2013 MathOverflow\r\n\t\t '.strip()
u'1 \u2013 MathOverflow'

【讨论】:

  • 我将如何在程序中做到这一点?我可以写item1['Title']= item1['title'].strip(),吗?我是 python 新手。
  • 是的,假设 item1['title'] 是一个字符串。
猜你喜欢
  • 2020-03-05
  • 2013-01-29
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多