繁体   English   中英

如何使用Python删除XPath元素中的错误数据?

[英]How can I remove bad data in an XPath element using Python?

我有这个简短的例子来证明我的问题:

from lxml import html

post = """<p>This a page with URLs.
<a href="http://google.com">This goes to&#xA; Google</a><br/>
<a href="http://yahoo.com">This &#xA; goes to Yahoo!</a><br/>
<a&#xA;href="http://example.com">This is invalid due to that&#xA;line feed character</p>&#xA;"""

doc = html.fromstring(post)
for link in doc.xpath('//a'):
    print link.get('href')

这输出:

http://google.com
http://yahoo.com
None

问题是我的数据有&#xA; 嵌入其中的字符。 对于我的上一个链接,它直接嵌入在锚点和href属性之间。 在元素之外的换行对我来说很重要。

doc.xpath('//a')正确地将<a&#xA;href="http://example.com">视为链接,但是当我执行link.get('href')时它无法访问href属性link.get('href')

如果link.get('href')返回None ,我该如何清理数据,这样我仍然可以检索发现的href属性?

我无法剥离所有&#xA; 整个post元素中的字符与文本中的字符很重要。

模块unidecode

由于您需要标签之外的数据,您可以尝试使用unidecode 它没有处理中文和韩文,但它会做一些事情,比如将左右引号改为ASCII引号。 它应该有助于这些&#xA; 字符也是如此,将它们更改为空格而不是不间断的空格。 希望这是保留其他数据所需的全部内容。 str.replace(u"\\#xa", u" ")如果ascii空间没问题就不那么重了。

import unidecode, urllib2
from lxml import html

html_text = urllib2.urlopen("http://www.yourwebsite.com")
ascii_text = unidecode.unidecode(html_text)
html.fromstring(ascii_text)

问题说明

在几个Python版本中似乎存在已知问题 它也是C# 一个相关的封闭问题似乎表明问题已经关闭,因为XML属性标记不是为了支持回车而构建的,所以在所有xml上下文中转义它都会很愚蠢。 事实证明,W3C规范要求在解析时放入unicode( 参见第1节 )。

所有换行必须在输入到#xA时进行标准化,如2.11行结束处理中所述,因此该算法的其余部分对以这种方式标准化的文本进行操作。

您可以通过以下方式解决您的具

post = post.replace('&#xA;', '\n')

得出的测试程序:

from lxml import html

post = """<p>This a page with URLs. 
<a href="http://google.com">This goes to&#xA; Google</a><br/>
<a href="http://yahoo.com">This &#xA; goes to Yahoo!</a><br/>
<a&#xA;href="http://example.com">This is invalid due to that&#xA;line feed character</p>&#xA;"""

post = post.replace('&#xA;', '\n')

doc = html.fromstring(post)
for link in doc.xpath('//a'):
    print link.get('href')

输出:

http://google.com
http://yahoo.com
http://example.com

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM