Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在分析带有“quot;”的HTML标记:&引用;使用lxml_Python_Html_Parsing_Lxml - Fatal编程技术网

Python 正在分析带有“quot;”的HTML标记:&引用;使用lxml

Python 正在分析带有“quot;”的HTML标记:&引用;使用lxml,python,html,parsing,lxml,Python,Html,Parsing,Lxml,我是python新手,我正在尝试用lxml解析Html页面。我想从标签中获取文本。但在它里面我有一个奇怪的标签,像这样: <p style="margin-left:0px;padding:0 0 0 0;float:left;"> <g:plusone size="medium"> </g:plusone> </p> 我希望在标记中得到一些文本。但是当我看起来像这样时,它在上面这样的片段上失败了。它写

我是python新手,我正在尝试用lxml解析Html页面。我想从
标签中获取文本。但在它里面我有一个奇怪的标签,像这样:

  <p style="margin-left:0px;padding:0 0 0 0;float:left;">
       <g:plusone size="medium">
       </g:plusone>
      </p>

我希望在
标记中得到一些文本。但是当我看起来像这样时,它在上面这样的片段上失败了。它写着:“标签g:plusone无效”。我所需要的就是忽略所有像这样的不直接标记。我不知道将来会有多少个这样的标签,但我认为真正的问题在于:“现在,因为当我使用“.tag”并获得名称时,它只是“plusone”,而不是“g:plusone”

我找到了一种清理html的方法:

from lxml import etree
from StringIO import StringIO

s = '''<p style="margin-left:0px;padding:0 0 0 0;float:left;">
   <g:plusone size="medium">
   </g:plusone>
  </p>'''

parser = etree.HTMLParser()
tree = etree.parse(StringIO(s), parser)
result = etree.tostring(tree.getroot(),pretty_print=True,method="html")
print result
根据,lxml.etree.\u元素是文档实例引用的类,换句话说,它是实例化etree.Element的结果

el = etree.Element("an_etree.Element_reference")
print type(el) # prints lxml.etree._Element

以下是我找到的清理html的方法:

from lxml import etree
from StringIO import StringIO

s = '''<p style="margin-left:0px;padding:0 0 0 0;float:left;">
   <g:plusone size="medium">
   </g:plusone>
  </p>'''

parser = etree.HTMLParser()
tree = etree.parse(StringIO(s), parser)
result = etree.tostring(tree.getroot(),pretty_print=True,method="html")
print result
根据,lxml.etree.\u元素是文档实例引用的类,换句话说,它是实例化etree.Element的结果

el = etree.Element("an_etree.Element_reference")
print type(el) # prints lxml.etree._Element

g:
是名称空间前缀。实际标记名仅为
plusone
。因此,lxml只返回
plusone
作为标记名是正确的。请参阅名称空间摘要

据我所知,lxml的HTML解析器不知道名称空间。但是,XML解析器是不可用的。假设这个HTML文档包含XML,那么它很可能实际上是一个XHTML文档(如果不是,那么它可能是一个无效的HTML文档,您不能期望lxml正确地解析它)。因此,您需要通过XML解析器而不是HTML解析器来运行它。lxml的名称空间API在其

但是,对于您提供的片段,解析器将返回以下内容:

>>> d = etree.fromstring('''<p style="margin-left:0px;padding:0 0 0 0;float:left;">
...        <g:plusone size="medium">
...        </g:plusone>
...       </p>''')
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "lxml.etree.pyx", line 3032, in lxml.etree.fromstring (src\lxml\lxml.etree.c:68121)
  File "parser.pxi", line 1786, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:102470)
  File "parser.pxi", line 1674, in lxml.etree._parseDoc (src\lxml\lxml.etree.c:101299)
  File "parser.pxi", line 1074, in lxml.etree._BaseParser._parseDoc (src\lxml\lxml.etree.c:96481)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:91290)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:92476)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:91772)
lxml.etree.XMLSyntaxError: Namespace prefix g on plusone is not defined, line 2, column 23
请注意,
g:
前缀被替换为实际名称空间(
{something}
,在本例中,我这样设置:
xmlns:g=“something”
)。通常名称空间实际上是一个URI。因此,您可能会发现您的标记看起来像这样:
{http://where.it/is/from.xml}plusone


尽管如此,当名称空间不是必需的时候,我发现使用名称空间相当麻烦。实际上,您可能会发现使用忽略名称空间的HTML解析器更容易。既然您知道标记名为
plusone
,而不是
g:plusone
,您就可以只使用HTML解析器继续工作了。

g:是名称空间前缀。实际标记名仅为
plusone
。因此,lxml只返回
plusone
作为标记名是正确的。请参阅名称空间摘要

据我所知,lxml的HTML解析器不知道名称空间。但是,XML解析器是不可用的。假设这个HTML文档包含XML,那么它很可能实际上是一个XHTML文档(如果不是,那么它可能是一个无效的HTML文档,您不能期望lxml正确地解析它)。因此,您需要通过XML解析器而不是HTML解析器来运行它。lxml的名称空间API在其

但是,对于您提供的片段,解析器将返回以下内容:

>>> d = etree.fromstring('''<p style="margin-left:0px;padding:0 0 0 0;float:left;">
...        <g:plusone size="medium">
...        </g:plusone>
...       </p>''')
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "lxml.etree.pyx", line 3032, in lxml.etree.fromstring (src\lxml\lxml.etree.c:68121)
  File "parser.pxi", line 1786, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:102470)
  File "parser.pxi", line 1674, in lxml.etree._parseDoc (src\lxml\lxml.etree.c:101299)
  File "parser.pxi", line 1074, in lxml.etree._BaseParser._parseDoc (src\lxml\lxml.etree.c:96481)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:91290)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:92476)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:91772)
lxml.etree.XMLSyntaxError: Namespace prefix g on plusone is not defined, line 2, column 23
请注意,
g:
前缀被替换为实际名称空间(
{something}
,在本例中,我这样设置:
xmlns:g=“something”
)。通常名称空间实际上是一个URI。因此,您可能会发现您的标记看起来像这样:
{http://where.it/is/from.xml}plusone


尽管如此,当名称空间不是必需的时候,我发现使用名称空间相当麻烦。实际上,您可能会发现使用忽略名称空间的HTML解析器更容易。既然您知道标记名为
plusone
,而不是
g:plusone
,您就可以只使用HTML解析器继续工作了。

标记中的简单内联CSS样式属性不应导致lxml出现问题。请尝试
@Mike您希望
text=[b.text for b in root.iterfind(“.//p”)]
返回什么?它还回来了什么?您能更新问题中的所有信息吗?@PM 2Ring,我能用html格式的xml做什么?简单忽略或以某种方式删除?标记中的简单内联CSS样式属性不应导致lxml出现问题。请尝试
中的
中的
@Mike您希望
text=[b.text for b in root.iterfind(.//p”)]
返回什么?它还回来了什么?您能更新问题中的所有信息吗?@PM 2Ring,我能用html格式的xml做什么?简单地忽略或删除?这不是一个好主意,因为结果毕竟是一个字符串,我需要“etree.Element”。如果我使用“from_string”-它会减慢我的程序。我可以用这个“美丽的汤”,但lxml更快。谢谢你的建议@Mike:tree.getroot()是一个etree.Element引用,即一个etree.\u元素,与Java相比,这是一个非常奇怪的类名switcheroo。也很难重新搜索。这不是一个好主意,因为result-毕竟是一个字符串,我需要“etree.Element”。如果我使用“from_string”-它会减慢我的程序。我可以用这个“美丽的汤”,但lxml更快。谢谢你的建议@Mike:tree.getroot()是一个etree.Element引用,即一个etree.\u元素,与Java相比,这是一个非常奇怪的类名switcheroo。也很难研究。
>>> d = etree.fromstring('''<p style="margin-left:0px;padding:0 0 0 0;float:left;">
...        <g:plusone xmlns:g="something" size="medium">
...        </g:plusone>
...       </p>''')
>>> d
<Element p at 0x2563cd8>
>>> d.tag
'p'
>>> d[0]
<Element {something}plusone at 0x2563940>
>>> d[0].tag
'{something}plusone'