当我更新我的包时,我遇到了这个新错误:
class TreeBuilderForHtml5lib(html5lib.treebuilders._base.TreeBuilder):
AttributeError: 'module' object has no attribute '_base'
Run Code Online (Sandbox Code Playgroud)
我尝试更新beautifulsoup
,没有更多的结果.我该如何解决这个问题?
使用带有html5lib的beautifulsoup,它会自动放置html,head和body标签:
BeautifulSoup('<h1>FOO</h1>', 'html5lib') # => <html><head></head><body><h1>FOO</h1></body></html>
Run Code Online (Sandbox Code Playgroud)
我可以设置任何选项,关闭此行为?
我正在尝试使用html5lib将html页面解析为我可以使用xpath查询的内容.html5lib文档接近零,我花了太多时间试图解决这个问题.最终目标是拉出表的第二行:
<html>
<table>
<tr><td>Header</td></tr>
<tr><td>Want This</td></tr>
</table>
</html>
Run Code Online (Sandbox Code Playgroud)
所以试试吧:
>>> doc = html5lib.parse('<html><table><tr><td>Header</td></tr><tr><td>Want This</td> </tr></table></html>', treebuilder='lxml')
>>> doc
<lxml.etree._ElementTree object at 0x1a1c290>
Run Code Online (Sandbox Code Playgroud)
看起来不错,让我们看看我们还有什么:
>>> root = doc.getroot()
>>> print(lxml.etree.tostring(root))
<html:html xmlns:html="http://www.w3.org/1999/xhtml"><html:head/><html:body><html:table><html:tbody><html:tr><html:td>Header</html:td></html:tr><html:tr><html:td>Want This</html:td></html:tr></html:tbody></html:table></html:body></html:html>
Run Code Online (Sandbox Code Playgroud)
大笑?
认真.我打算使用一些xpath来获取我想要的数据,但这似乎不起作用.那我该怎么办?我愿意尝试不同的库和方法.
我正在HTML
使用BeautifulSoup进行解析.最后,我想获取body
内容,但没有body
标签.但是BeautifulSoup增加html
,head
和body
标签.我这个googlegrops讨论提出了一个可能的解决方案:
>>> from bs4 import BeautifulSoup as Soup
>>> soup = Soup('<p>Some paragraph</p>')
>>> soup.body.hidden = True
>>> soup.body.prettify()
u' <p>\n Some paragraph\n </p>'
Run Code Online (Sandbox Code Playgroud)
这个解决方案是一个黑客.应该有一种更好,更明显的方法来做到这一点.
由于各种原因,我试图从切换lxml.html.fromstring()
到lxml.html.html5parser.document_fromstring()
.两者之间的最大区别是第一个返回一个lxml.html.HtmlElement
,第二个返回一个lxml.etree._Element
.
大多数情况下这没关系,但是当我尝试用_Element
对象运行我的代码时,它会崩溃,说:
AttributeError: 'lxml.etree._Element' object has no attribute 'rewrite_links'
Run Code Online (Sandbox Code Playgroud)
这是有道理的.我的问题是,处理这个问题的最佳方法是什么.我有很多代码需要HtmlElements,所以我认为最好的解决方案是转换为那些.我不确定这是否可行.
一个可怕的解决方案看起来像这样:
from lxml.html import fromstring, tostring
from lxml.html import html5parser
e = html5parser.fromstring(text)
html_element = fromstring(tostring(e))
Run Code Online (Sandbox Code Playgroud)
显然,这是非常强大的力量,但确实有效.我能够得到一个被html5parser解析的HtmlElement,这就是我所追求的.
另一个选择是找出如何进行我依赖的rewrite_links和xpath查询,但是_Element
似乎没有那个函数(这也是有意义的!)
在尝试读取 html 数据框时,我遇到了有关 html5lib 的以下错误。
这是代码:
!pip install html5lib
!pip install lxml
!pip install beautifulSoup4
import html5lib
import lxml
from bs4 import BeautifulSoup
table_list = pd.read_html("http://www.psmsl.org/data/obtaining/")
Run Code Online (Sandbox Code Playgroud)
这是错误:
ImportError Traceback (most recent call last)
<ipython-input-68-e24654a0a301> in <module>()
----> 1 table_list = pd.read_html("http://www.psmsl.org/data/obtaining/")
/home/sage/sage-8.0/local/lib/python2.7/site-packages/pandas/io/html.pyc in read_html(io, match, flavor, header, index_col, skiprows, attrs, parse_dates, tupleize_cols, thousands, encoding, decimal, converters, na_values, keep_default_na)
913 thousands=thousands, attrs=attrs, encoding=encoding,
914 decimal=decimal, converters=converters, na_values=na_values,
--> 915 keep_default_na=keep_default_na)
/home/sage/sage-8.0/local/lib/python2.7/site-packages/pandas/io/html.pyc in _parse(flavor, io, match, attrs, encoding, **kwargs)
737 retained = …
Run Code Online (Sandbox Code Playgroud) 请提出建议,谢谢:)
pip list --outdated --format=freeze
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
ERROR: Exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 223, in _main
status = self.run(options, args)
File "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", line 175, in run
packages = self.get_outdated(packages, options)
File "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", line 184, in get_outdated
return [
File "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", line 184, in <listcomp>
return [
File "/usr/lib/python3/dist-packages/pip/_internal/commands/list.py", line 237, in iter_packages_latest_infos
for dist in map_multithread(latest_info, packages):
File "/usr/lib/python3.9/multiprocessing/pool.py", line 870, in next
raise value
File "/usr/lib/python3.9/multiprocessing/pool.py", line 125, in worker
result = (True, func(*args, **kwds))
File …
Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法来使用Python库html5lib来转换这样的东西:
<p>Hello World. Greetings from <strong>Mars.</strong></p>
Run Code Online (Sandbox Code Playgroud)
至
Hello World. Greetings from Mars.
Run Code Online (Sandbox Code Playgroud) 我使用BeautifulSoup 4与Python 2.7版.我想从网站中提取某些元素(数量,请参见下面的示例).由于某种原因,lxml解析器不允许我从页面中提取所有所需的元素.它只打印前三个元素.我正在尝试使用html5lib解析器来查看是否可以提取所有这些.
该页面包含多个项目及其价格和数量.包含每个项目所需信息的代码的一部分如下所示:
<td class="size-price last first" colspan="4">
<span>453 grams </span>
<span> <span class="strike">$619.06</span> <span class="price">$523.91</span>
</span>
</td>
Run Code Online (Sandbox Code Playgroud)
让我们考虑以下三种情况:
案例1 - 数据:
#! /usr/bin/python
from bs4 import BeautifulSoup
data = """
<td class="size-price last first" colspan="4">
<span>453 grams </span>
<span> <span class="strike">$619.06</span> <span class="price">$523.91</span>
</span>
</td>"""
soup = BeautifulSoup(data)
print soup.td.span.text
Run Code Online (Sandbox Code Playgroud)
打印:
453 grams
Run Code Online (Sandbox Code Playgroud)
案例2 - LXML:
#! /usr/bin/python
from bs4 import BeautifulSoup
from urllib import urlopen
webpage = urlopen('The URL …
Run Code Online (Sandbox Code Playgroud) 我试图在Python中找到一种解析(可能是格式错误的)HTML的方法,如果满足一组条件,则输出该文档的位置(行,列).位置信息正在绊倒我.要清楚,我没有必要构建一个对象树.我只是想找到某些数据及其在原始文档中的位置(想想一个拼写检查器,例如:'word'foo"在第x行,第y列,拼写错误)'
作为一个例子,我想要这样的东西(使用ElementTree的Target API):
import xml.etree.ElementTree as ET
class EchoTarget:
def start(self, tag, attrib):
if somecondition():
print "start", tag, attrib, self.getpos()
def end(self, tag):
if somecondition():
print "end", tag, self.getpos()
def data(self, data):
if somecondition():
print "data", repr(data), self.getpos()
target = EchoTarget()
parser = ET.XMLParser(target=target)
parser.feed("<p>some text</p>")
parser.close()
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,该getpos()
方法(或类似的东西)不存在.当然,那是使用XML解析器.我想解析可能格式错误的HTML.
有趣的是,Python Standard Lib中的HTMLParser类确实支持获取位置信息(使用getpos()
方法),但它在处理格式错误的HTML时非常糟糕,并且已被淘汰作为可能的解决方案.我需要在不破坏解析器的情况下解析真实单词中存在的HTML.
我知道两个HTML解析器可以很好地解析格式错误的HTML,即lxml和html5lib.事实上,我宁愿使用其中任何一个而不是Python中的任何其他选项.
但是,据我所知,html5lib不提供事件API,并且需要将文档解析为树对象.然后我将不得不遍历树.当然,到那时,与源文档没有关联,并且所有位置信息都丢失了.所以,html5lib已经出局,这是一种耻辱,因为它似乎是处理格式错误的HTML的最佳解析器.
lxml库提供了一个主要镜像ElementTree的Target API,但同样,我不知道有任何方法可以访问每个事件的位置信息.浏览源代码也没有提示.
lxml还为SAX事件提供API.有趣的是,Python的标准库提到SAX支持定位器对象,但很少提供有关如何使用它们的文档.这个SO问题提供了一些信息(当使用SAX Parser时),但我没有看到它与lxml提供的对SAX事件的有限支持有何关系.
最后,在有人推荐Beautiful Soup之前,我会指出,正如主页上所说,"Beautiful Soup位于流行的Python解析器之上,如lxml和html5lib".它给我的全部内容是从没有连接到原始源文档的数据中提取数据.与html5lib一样,当我访问数据时,所有位置信息都会丢失.我希望/需要直接对解析器进行原始访问.
为了扩展我在开头提到的拼写检查器示例,我想检查文档文本中的单词(但不是标签名称或属性)的拼写,并且可能想要跳过检查特定标签的内容(如脚本)或代码标签).因此,我需要一个真正的HTML解析器.但是,我只对原始源文档中拼写错误的单词的位置感兴趣,当涉及报告拼写错误的单词并且不需要构建树对象时.需要说明的是,这只是一个潜在用途的例子.我可以将它用于完全不同的东西,但需求基本相同.事实上,我曾经使用HTMLParser构建了一些非常相似的东西,但从未使用它,因为错误处理不适用于该用例.那是几年前的事了,而且我似乎已经在某个地方遗失了那个文件.我想这次使用lxml或html5lib.
那么,有什么我想念的吗?我很难相信这些解析器(除了大多数无用的HTMLParser之外)都没有办法访问位置信息.但是,如果他们这样做,它必须是无证的,这对我来说似乎很奇怪.