gpt4 book ai didi

python - BeautifulSoup 意外匹配 <!doctype>

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:15 25 4
gpt4 key购买 nike

我有一些简单的代码...

from bs4 import BeautifulSoup, SoupStrainer

text = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<div></div>
<div class='detail'></div>
<div></div>
<div class='detail'></div>
<div></div>"""

for div in BeautifulSoup(text, 'lxml', parse_only = SoupStrainer('div', attrs = { 'class': 'detail' })):
print(div)

...我希望打印两个带有“detail”类的 div。相反,出于某种原因,我得到了两个 div 和文档类型:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
<div class="detail"></div>
<div class="detail"></div>

这里发生了什么?如何避免匹配文档类型?

编辑

这是我发现的一种过滤方法:

from bs4 import BeautifulSoup, SoupStrainer, Doctype
...
for div in BeautifulSoup(text, 'lxml', parse_only = SoupStrainer('div', attrs = { 'class': 'detail' })):
if type(div) is Doctype:
continue

仍然想知道如何避免在使用 SoupStrainer 时必须过滤掉文档类型的情况。

我想使用 SoupStrainer 而不是 find_all 的原因是 SoupStrainer 快了几乎两倍,加起来大约 30 秒与仅 1000 个已解析页面的差异:

def soup_strainer(text):
[div for div in BeautifulSoup(text, 'lxml', parse_only = SoupStrainer('div', attrs = { 'class': 'detail' })) if type(div) is not Doctype]

def find_all(text):
[div for div in BeautifulSoup(text, 'lxml').find_all('div', { 'class': 'detail' })]

from timeit import timeit
print( timeit('soup_strainer(text)', number = 1000, globals = globals()) ) # 38.091634516923584
print( timeit('find_all(text)', number = 1000, globals = globals()) ) # 65.1686057066947

最佳答案

我认为您不需要为此任务使用 SoupStrainer。相反,内置的 findAll 方法应该做你想做的。这是我测试过的代码,似乎工作正常:

[div for div in BeautifulSoup(text, 'lxml').findAll('div', {'class':'detail'})]

这将创建您要查找的 div 的列表,不包括 DOCTYPE

希望这对您有所帮助。

关于python - BeautifulSoup 意外匹配 &lt;!doctype>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46240838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com