在python中序列化beautiful soup和xpath树

在python中序列化beautiful soup和xpath树,python,serialization,xpath,beautifulsoup,Python,Serialization,Xpath,Beautifulsoup,首先,有一个python脚本来获取xpath树和给定url # get tree def get_tree(url): r = requests.get(url) tree = html.fromstring(r.content) return tree # get soup def get_soup(url): r = requests.get(url) data = r.text soup = BeautifulSoup(data)

首先,有一个python脚本来获取xpath树和给定url

# get tree
def get_tree(url):
    r = requests.get(url)
    tree = html.fromstring(r.content)
    return tree

# get soup
def get_soup(url):
    r = requests.get(url)
    data = r.text
    soup = BeautifulSoup(data)
    return soup
我们经常需要树和汤来导航源代码页并提取我们需要的有用信息。但我们可能经常会有bug,然后修复它,或者我们改变了对我们真正需要的信息的想法。因此,从这个意义上讲,序列化soup和xpath树可能是一个好主意,我们只能提前一次完成。 但我们如何在python中序列化beautiful soup和xpath树呢? 是否有任何数据库可以存储soup或tree对象?如果没有,是否有手动序列化它们的示例代码?
谢谢

我从您的问题中了解到,您希望存储soup变量,这样您就不必在调试时反复请求url。似乎您不知道哪个可以序列化任何对象。它并非没有问题,但对于您的调试需求,它可以帮助您,而且非常简单

import pickle
pickle.dump(soup, open("soup.pickle","w"))
# then when you need to load the soup again
soup = pickle.load(open("soup.pickle","r"))

现在你给自己弄了一碗泡菜汤D

当您使用lxml时,所有这些都很简单:

tree = lxml.html.fromstring(html)
i_need_element = tree.xpath('//a[@class="shared-components"]/@href')
但使用BeautifulSoup BS4时也很简单:

  • 首先删除“/”和“@”
  • 第二个-在“=”之前添加星号
试试这个魔术:

soup = BeautifulSoup(html, "lxml")
i_need_element = soup.select ('a[class*="shared-components"]')

如您所见,这不支持子标记,因此我删除了“/@href”部分

唯一的缺点是,我无法从其他语言(如javaI)的脚本加载pickle,我尝试pickle tree。但我得到了如下错误:raise TypeError,“不能pickle%s对象”%base.\uuu name\uuuu TypeError:can't pickle\u Element objects幸运的是,不能pickle大型美化组。5MB文件的soup需要比硬限制更多的递归。对于较小的文件(我想是其中的大多数),这是很好的@标记以避免此限制您可以将汤编码为字符串-请参阅