我正在使用lxml.html编写一个脚本来解析网页.我在我的时间里做了很多BeautifulSoup,但由于它的速度,我现在正在尝试lxml.
我想知道库中最明智的方法是做相当于Javascript的InnerHtml - 即检索或设置标签的完整内容.
<body>
<h1>A title</h1>
<p>Some text</p>
</body>
Run Code Online (Sandbox Code Playgroud)
因此InnerHtml是:
<h1>A title</h1>
<p>Some text</p>
Run Code Online (Sandbox Code Playgroud)
我可以使用黑客(转换为字符串/正则表达式等)来做到这一点,但我假设有一个正确的方法来使用由于不熟悉我缺少的库.谢谢你的帮助.
编辑:感谢pobk如此快速有效地向我展示了这方面的方法.对于任何尝试相同的人,这是我最终得到的:
from lxml import html
from cStringIO import StringIO
t = html.parse(StringIO(
"""<body>
<h1>A title</h1>
<p>Some text</p>
Untagged text
<p>
Unclosed p tag
</body>"""))
root = t.getroot()
body = root.body
print (element.text or '') + ''.join([html.tostring(child) for child in body.iterdescendants()])
Run Code Online (Sandbox Code Playgroud)
请注意,lxml.html解析器将修复未关闭的标记,因此请注意这是否存在问题.
我有一个非常标准的多对多关系,类似于ORM教程中的Blog - > Keyword关系.
我想查询关键字列表,返回其中任何一个匹配的博客帖子.但是,如果有一个简单的方法可以解决这个问题我就无法解决.如果我添加多个过滤器,反复做
.filter(Blog.keywords.any(Keyword.name == 'keyword'))
Run Code Online (Sandbox Code Playgroud)
然后我得到一个'AND'/'EXISTS'查询,这样只返回包含所有这些关键字的帖子.是否有一种简单的方法可以将此作为"OR"查询,或者我是否需要使用join().
谢谢你的帮助; 我无法弄清楚我是否遗漏了什么.
我正在使用lxml来解析html并对其进行编辑以生成新文档.本质上,我试图使用它有点像javascript DOM - 我知道这不是真正的预期用途,但到目前为止它的大部分工作都很好.
目前,我使用iterdescendants()获取可迭代的元素列表,然后依次处理每个元素.
但是,如果在迭代期间删除了一个元素,则仍会考虑其子元素,因为删除不会像您期望的那样影响迭代.为了得到我想要的结果,这个hack有效:
from lxml.html import fromstring, tostring
import urllib2
import re
html = '''
<html>
<head>
</head>
<body>
<div>
<p class="unwanted">This content should go</p>
<p class="fine">This content should stay</p>
</div>
<div id = "second" class="unwanted">
<p class = "alreadydead">This content should not be looked at</p>
<p class = "alreadydead">Nor should this</>
<div class="alreadydead">
<p class="alreadydead">Still dead</p>
</div>
</div>
<div>
<p class="yeswanted">This content should also stay</p>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
for element in allElements:
s = "%s%s" % (element.get('class', …Run Code Online (Sandbox Code Playgroud) 我正在Deform/Colander中实现一个简单的'tick to agree条款和条件框'.
因此,我只想检查该复选框是否有错误信息"你必须同意T&C".
我明白我可以用:
colander.OneOf([True])
Run Code Online (Sandbox Code Playgroud)
确保勾选方框.但是,OneOf不允许自定义错误消息.这样做的正确方法是什么?
我需要与SOAP服务进行交互,并且这样做很麻烦; 我真的很感激任何指针.原始错误消息是:
org.apache.axis2.databinding.ADBException: Any type element type has not been given
Run Code Online (Sandbox Code Playgroud)
经过一番研究,事实证明,这是SUDS与服务器之间的分歧,如何应对
type="xsd:anyType"
Run Code Online (Sandbox Code Playgroud)
在有问题的元素上.
我已经确认使用SOAPUI,经过建议,可以通过以下步骤解决问题:
那么,SUDS目前在哪里这样做:
<SOAP-ENV:Envelope ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
<ns0:method>
<parameter>
<values>
<table>
<key>EMAIL_ADDRESS</key>
<value>example@example.org</value>
</table>
</values>
</parameter>
</ns0:method>
Run Code Online (Sandbox Code Playgroud)
它应该产生这个:
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
<ns0:method>
...
<parameter>
<values>
<table>
<key xsi:type="xsd:string">EMAIL_ADDRESS</key>
<value xsi:type="xsd:string">example@example.org</value>
</table>
</values>
</parameter>
</ns0:method>
Run Code Online (Sandbox Code Playgroud)
有没有正确的方法来做到这一点?我已经看到了使用ImportDoctor或MessagePlugins的建议,但还没有真正了解如何实现所需的效果.