标签: lxml.html

在BeautifulSoup中扩展CSS选择器

问题:

BeautifulSoupCSS选择器提供非常有限的支持.例如,唯一支持的伪类是nth-of-type,它只能接受数值 - 参数喜欢evenodd不允许.

是否可以扩展BeautifulSoupCSS选择器或让它在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)

python beautifulsoup css-selectors html-parsing lxml.html

17
推荐指数
1
解决办法
1701
查看次数

如何使用lxml.html text_content()或等效内容将<br>保留为换行符?

我想保留<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)

python lxml lxml.html

16
推荐指数
1
解决办法
4978
查看次数

如何在Python中使用lxml.html.clean.Cleaner()保留内联CSS样式?

我正在尝试使用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相关的风格,并对待其他风格相同?希望不是.

感谢您的任何见解!

python lxml lxml.html

11
推荐指数
1
解决办法
1159
查看次数

如何使用Cleaner,lxml.html而不返回div标签?

我有这个代码:

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标记包装的属性?

python lxml.html

11
推荐指数
1
解决办法
1040
查看次数

为什么我会收到此导入错误?

我有一个tkinter正在编译为.exevia 的应用程序py2exe

在安装文件中,我将其设置为包含lxmlurlliblxml.htmlastmath

当我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)

python lxml py2exe importerror lxml.html

7
推荐指数
1
解决办法
1万
查看次数

如何解决lxml中删除的cssselect包的问题?

所以他们从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包)

python xpath lxml pypi lxml.html

7
推荐指数
2
解决办法
7746
查看次数

在python中使用lxml打印html实体

我正在尝试使用html实体从下面的字符串中创建一个div元素。由于我的字符串包含html实体,因此html实体中的&保留char像&amp;在输出中一样被转义。因此,html实体显示为纯文本。如何避免这种情况,以便正确呈现html实体?

s = 'Actress Adamari L&#243;pez And Amgen Launch Spanish-Language Chemotherapy: Myths Or Facts&#8482; Website And Resources'

div = etree.Element("div")
div.text = s

lxml.html.tostring(div)

output:
<div>Actress Adamari L&amp;#243;pez And Amgen Launch Spanish-Language Chemotherapy: Myths Or Facts&amp;#8482; Website And Resources</div>
Run Code Online (Sandbox Code Playgroud)

html python lxml html-parsing lxml.html

5
推荐指数
1
解决办法
1371
查看次数

如何使用Python LXML重命名节点?

如何使用LXML重命名节点?

具体来说,如何<body>在保留所有底层结构的同时重命名父节点即标签?

我正在使用该lxml.html模块进行解析,但据说在xml和html之间在重命名lxml.html.HtmlElement和XML对应方面应该没有任何区别.

我在LXML网站上搜索了文档但没有找到任何重命名节点的参考.

python xml lxml lxml.html

5
推荐指数
1
解决办法
2223
查看次数

Python:将原始字符串转换为字节字符串而不添加转义字符

我有一个字符串:

'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)

该包是我使用的是requestslxml.htmlre,和bz2

再次,我的目标是解压un使用bz2,但我有困难,从我webscraping过程中得到一个字节状物体。

任何指针?

python lxml python-3.x lxml.html bz2

5
推荐指数
0
解决办法
2410
查看次数

输入 lxml 的提示?

Python 新手,来自静态类型语言背景。我想要https://lxml.de 的类型提示只是为了便于开发(mypy 标记问题并建议方法会很好!)

据我所知,这是一个 python 2.0 模块,没有类型。目前我已经使用https://mypy.readthedocs.io/en/stable/stubgen.html创建存根类型定义并填写我正在使用的“任何”类型的更多信息,但它真的很hacky。有没有更安全的方法来获取类型提示?

lxml types python-3.x lxml.html mypy

5
推荐指数
1
解决办法
771
查看次数