问题:
BeautifulSoup
为CSS选择器提供非常有限的支持.例如,唯一支持的伪类是nth-of-type
,它只能接受数值 - 参数喜欢even
或odd
不允许.
是否可以扩展BeautifulSoup
CSS选择器或让它在lxml.cssselect
内部用作底层CSS选择机制?
我们来看一个示例问题/用例.在以下HTML中仅查找偶数行:
<table>
<tr>
<td>1</td>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<td>4</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
在lxml.html
和中lxml.cssselect
,很容易做到:nth-of-type(even)
:
from lxml.html import fromstring
from lxml.cssselect import CSSSelector
tree = fromstring(data)
sel = CSSSelector('tr:nth-of-type(even)')
print [e.text_content().strip() for e in sel(tree)]
Run Code Online (Sandbox Code Playgroud)
但是,在BeautifulSoup
:
print(soup.select("tr:nth-of-type(even)"))
Run Code Online (Sandbox Code Playgroud)
会抛出错误:
NotImplementedError:nth-of-type伪类目前仅支持数值.
请注意,我们可以解决此问题.find_all()
:
print([row.get_text(strip=True) for index, row in enumerate(soup.find_all("tr"), start=1) if …
Run Code Online (Sandbox Code Playgroud) 我想保留<br>
标签,就像\n
从lxml元素中提取文本内容一样.
示例代码:
fragment = '<div>This is a text node.<br/>This is another text node.<br/><br/><span>And a child element.</span><span>Another child,<br> with two text nodes</span></div>'
h = lxml.html.fromstring(fragment)
Run Code Online (Sandbox Code Playgroud)
输出:
> h.text_content()
'This is a text node.This is another text node.And a child element.Another child, with two text nodes'
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用lxml.html.clean.Cleaner()清理html表.我需要去掉javascript属性,但是想保留内联css样式.我认为style = False是默认设置:
import lxml.html.clean
cleaner = lxml.html.clean.Cleaner()
Run Code Online (Sandbox Code Playgroud)
但是,当我打电话的时候 cleaner.clean_html(doc)
<span style="color:#008800;">67.51</span>
Run Code Online (Sandbox Code Playgroud)
会变成
<span>67.51</span>
Run Code Online (Sandbox Code Playgroud)
基本上,风格不会保留.我试着添加:
cleaner.style= False
Run Code Online (Sandbox Code Playgroud)
它无济于事.
更新:我在Dreamhost上使用Python 2.6.6 + lxml 3.2.4,在本地Macbook上使用Python 2.7.5 + lxml 3.2.4.结果相同.另一件事:我的html中有一个与javacript相关的属性:
<td style="cursor:pointer;">Ticker</td>
是不是lxml剥离了这个javacript相关的风格,并对待其他风格相同?希望不是.
感谢您的任何见解!
我有这个代码:
evil = "<script>malignus script</script><b>bold text</b><i>italic text</i>"
cleaner = Cleaner(remove_unknown_tags=False, allow_tags=['p', 'br', 'b'],
page_structure=True)
print cleaner.clean_html(evil)
Run Code Online (Sandbox Code Playgroud)
我希望得到这个:
<b>bold text</b>italic text
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了这个:
<div><b>bold text</b>italic text</div>
Run Code Online (Sandbox Code Playgroud)
是否有删除div
标记包装的属性?
我有一个tkinter
正在编译为.exe
via 的应用程序py2exe
。
在安装文件中,我将其设置为包含lxml
、urllib
、lxml.html
、ast
和math
。
当我python setup.py py2exe
在 CMD 控制台中运行时,它编译得很好。然后我转到dist
它创建的文件夹,并运行该.exe
文件。
当我运行时,.exe
我得到这个弹出窗口。
(来源:gyazo.com)
然后我继续打开该Trader.exe.log
文件,内容如下:
Traceback (most recent call last):
File "Trader.py", line 1, in <module>
File "lxml\html\__init__.pyc", line 42, in <module>
File "lxml\etree.pyc", line 12, in <module>
File "lxml\etree.pyc", line 10, in __load
File "lxml.etree.pyx", line 84, in init lxml.etree (src\lxml\lxml.etree.c:190292)
ImportError: cannot import name …
Run Code Online (Sandbox Code Playgroud) 所以他们从lxml中删除了cssselect包.现在我的python程序没用了.我只是无法弄清楚我是如何让它工作的:
ImportError:似乎没有安装cssselect.见http://packages.python.org/cssselect/
我试图将cssselect目录复制到我的代码目录 - >在编译字节码文件时解决了错误,但是在运行程序时,错误仍然存在.
我试图重写我的lxml.cssselect命令,但没有结果.
我搜索了整个互联网,但没有答案.
现在我只有一行:
from lxml.html import parse
Run Code Online (Sandbox Code Playgroud)
并且使用cssselect的代码是
inner = html.xpath('//*[@id="Content..."]')
for b in inner:
...
for a in b.cssselect('p'):
...
Run Code Online (Sandbox Code Playgroud)
那么要么如何导入它以便原始代码有效?我需要手动将其复制到某个地方还是什么?
或者如何查找/替换代码以使其正常工作?
(哦,还有一张纸条,我已经安装了lxml和cssselect包)
我正在尝试使用html实体从下面的字符串中创建一个div元素。由于我的字符串包含html实体,因此html实体中的&
保留char像&
在输出中一样被转义。因此,html实体显示为纯文本。如何避免这种情况,以便正确呈现html实体?
s = 'Actress Adamari López And Amgen Launch Spanish-Language Chemotherapy: Myths Or Facts™ Website And Resources'
div = etree.Element("div")
div.text = s
lxml.html.tostring(div)
output:
<div>Actress Adamari L&#243;pez And Amgen Launch Spanish-Language Chemotherapy: Myths Or Facts&#8482; Website And Resources</div>
Run Code Online (Sandbox Code Playgroud) 如何使用LXML重命名节点?
具体来说,如何<body>
在保留所有底层结构的同时重命名父节点即标签?
我正在使用该lxml.html
模块进行解析,但据说在xml和html之间在重命名lxml.html.HtmlElement
和XML对应方面应该没有任何区别.
我在LXML网站上搜索了文档但没有找到任何重命名节点的参考.
我有一个字符串:
'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
Run Code Online (Sandbox Code Playgroud)
而且我要:
b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
Run Code Online (Sandbox Code Playgroud)
但我不断得到:
b'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'
Run Code Online (Sandbox Code Playgroud)
语境
我从网页上刮下一个字符串并将其存储在变量中un
。现在我想用 BZip2 解压它:
bz2.decompress(un)
Run Code Online (Sandbox Code Playgroud)
但是,由于un
是一个str
对象,我收到此错误:
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
因此,我需要在un
不将单个反斜杠更改为转义反斜杠的情况下转换为类似字节的对象。
编辑1: 感谢您的所有帮助!@wim 我现在明白你的意思了,但我不知道如何从我的网页抓取方法中检索一个类似字节的对象:
r = requests.get('http://www.pythonchallenge.com/pc/def/integrity.html')
doc = html.fromstring(r.content)
comment = doc.xpath('//comment()')[0].text.split('\n')[1:3]
pattern = re.compile("[a-z]{2}: '(.+)'")
un = re.search(pattern, comment[0]).group(1)
Run Code Online (Sandbox Code Playgroud)
该包是我使用的是requests
,lxml.html
,re
,和bz2
。
再次,我的目标是解压un
使用bz2
,但我有困难,从我webscraping过程中得到一个字节状物体。
任何指针?
Python 新手,来自静态类型语言背景。我想要https://lxml.de 的类型提示只是为了便于开发(mypy 标记问题并建议方法会很好!)
据我所知,这是一个 python 2.0 模块,没有类型。目前我已经使用https://mypy.readthedocs.io/en/stable/stubgen.html创建存根类型定义并填写我正在使用的“任何”类型的更多信息,但它真的很hacky。有没有更安全的方法来获取类型提示?
lxml.html ×10
python ×9
lxml ×8
html-parsing ×2
python-3.x ×2
bz2 ×1
html ×1
importerror ×1
mypy ×1
py2exe ×1
pypi ×1
types ×1
xml ×1
xpath ×1