Table des matières
1. Présentation de Beautiful Soup :
Installation :
二、BeautifulSoup4简单使用
三、BeautifulSoup4四大对象种类
1、Tag:标签
2、NavigableString:标签内部的文字
3、BeautifulSoup:文档的内容
4、Comment:注释
四、遍历文档树所用属性
五、搜索文档树
1、find_all():过滤器
(2)kwargs参数:
(3)attrs参数:
(4)text参数:
(5)limit参数
2、find()
六、CSS选择器:select()方法
七、综合实例:
八、BeautifulSoup 和lxml(Xpath)对比
Maison développement back-end Tutoriel Python Comment Python utilise la bibliothèque Beautiful Soup (BS4) pour analyser HTML et XML

Comment Python utilise la bibliothèque Beautiful Soup (BS4) pour analyser HTML et XML

May 13, 2023 pm 09:55 PM
python xml html

1. Présentation de Beautiful Soup :

Beautiful Soup prend en charge les bibliothèques Python qui extraient des données à partir de fichiers HTML ou XML ;

Il prend en charge l'analyseur HTML dans la bibliothèque standard Python et prend également en charge certains analyseurs tiers lxml.

Beautiful Soup convertit automatiquement les documents d'entrée en codage Unicode et les documents de sortie en codage UTF-8.

Installation :

pip install beautifulsoup4pip install beautifulsoup4

可选择安装解析器

  • pip install lxml

  • pip install html5lib

二、BeautifulSoup4简单使用

假设有这样一个Html,具体内容如下:

<!DOCTYPE html>
<html>
<head>
    <meta content="text/html;charset=utf-8" http-equiv="content-type" />
    <meta content="IE=Edge" http-equiv="X-UA-Compatible" />
    <meta content="always" name="referrer" />
    <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="external nofollow"  rel="stylesheet" type="text/css" />
    <title>百度一下,你就知道 </title>
</head>
<body link="#0000cc">
  <div id="wrapper">
    <div id="head">
        <div class="head_wrapper">
          <div id="u1">
            <a class="mnav" href="http://news.baidu.com" rel="external nofollow"  name="tj_trnews">新闻 </a>
            <a class="mnav" href="https://www.hao123.com" rel="external nofollow"  name="tj_trhao123">hao123 </a>
            <a class="mnav" href="http://map.baidu.com" rel="external nofollow"  name="tj_trmap">地图 </a>
            <a class="mnav" href="http://v.baidu.com" rel="external nofollow"  name="tj_trvideo">视频 </a>
            <a class="mnav" href="http://tieba.baidu.com" rel="external nofollow"  rel="external nofollow"  name="tj_trtieba">贴吧 </a>
            <a class="bri" href="//www.baidu.com/more/" rel="external nofollow"  name="tj_briicon" >更多产品 </a>
          </div>
        </div>
    </div>
  </div>
</body>
</html>
Copier après la connexion

创建beautifulsoup4对象:

from bs4 import BeautifulSoup

file = open(&#39;./aa.html&#39;, &#39;rb&#39;)
html = file.read()
bs = BeautifulSoup(html, "html.parser")  # 缩进格式

print(bs.prettify())  # 格式化html结构
print(bs.title)  # 
print(bs.title.name)  # 获取title标签的名称 :title
print(bs.title.string)  # 获取title标签的文本内容 :   百度一下,你就知道
print(bs.head)  # 获取head标签的所有内容 :
print(bs.div)  # 获取第一个div标签中的所有内容   :
print(bs.div["id"])  # 获取第一个div标签的id的值      :    wrapper
print(bs.a)  # 获取第一个a标签中的所有内容    :       <a href="http://news.baidu.com/" rel="external nofollow"   target="_blank">新闻 </a>
print(bs.find_all("a"))  # 获取所有的a标签中的所有内容     :   [....]
print(bs.find(id="u1"))  # 获取id="u1"的所有内容 :
for item in bs.find_all("a"):  # 获取所有的a标签,并遍历打印a标签中的href的值    :
    print(item.get("href"))
for item in bs.find_all("a"):  # 获取所有的a标签,并遍历打印a标签的文本值:
    print(item.get_text())
Copier après la connexion

三、BeautifulSoup4四大对象种类

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag 、NavigableString 、BeautifulSoup 、Comment、

1、Tag:标签

Tag通俗点讲就是HTML中的一个个标签,例如:

print(bs.title) # 获取title标签的所有内容
print(bs.head) # 获取head标签的所有内容
print(bs.a) # 获取第一个a标签的所有内容
print(type(bs.a))# 类型
Copier après la connexion

我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。但是注意,它查找的是在所有内容中的第一个符合要求的标签。

对于 Tag,它有两个重要的属性,是 name 和 attrs:

print(bs.name) # [document] #bs 对象本身比较特殊,它的 name 即为 [document]
print(bs.head.name) # head #对于其他内部标签,输出的值便为标签本身的名称
print(bs.a.attrs) # 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a[&#39;class&#39;]) ##还可以利用get方法,传入属性的名称,二者是等价的,等价 bs.a.get(&#39;class&#39;)

bs.a[&#39;class&#39;] = "newClass"# 可以对这些属性和内容等等进行修改
print(bs.a) 

del bs.a[&#39;class&#39;] # 还可以对这个属性进行删除
print(bs.a)
Copier après la connexion

既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如:

print(bs.title.string)  # 百度一下,你就知道 
print(type(bs.title.string))  #
Copier après la connexion

3、BeautifulSoup:文档的内容

BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性,例如:

print(type(bs.name))  # 
print(bs.name)  # [document]
print(bs.attrs)  # {}
Copier après la connexion

4、Comment:注释

Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。

print(bs.a)
# 此时不能出现空格和换行符,a标签如下:
# 
print(bs.a.string) # 新闻
print(type(bs.a.string)) #
Copier après la connexion

四、遍历文档树所用属性

  • .contents:获取Tag的所有子节点,返回一个list

print(bs.head.contents)     # tag的.contents属性可以将tag的子节点以列表的方式输出:[...]
print(bs.head.contents[1])  # 用列表索引来获取它的某一个元素:
Copier après la connexion
  • .children:获取Tag的所有子节点,返回一个生成器

for child in bs.body.children:
    print(child)
Copier après la connexion
  • .descendants:获取Tag的所有子孙节点

  • .parent:获取Tag的父节点

  • .parents:递归得到父辈元素的所有节点,返回一个生成器

  • .previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符

  • .next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符

  • .previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器

  • .next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器

  • .previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的

  • .next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的

  • .previous_elements:返回一个生成器,可以向前访问文档的解析内容

  • .next_elements:返回一个生成器,可以向后访问文档的解析内容

  • .strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历

  • .stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容

  • .has_attr:判断Tag是否包含属性

五、搜索文档树

1、find_all():过滤器

find_all(name, attrs, recursive, text, **kwargs):

Facultatif pour installer l'analyseur

pip install lxml</ code><p></li><li><strong><code>pip install html5lib

2 Utilisation simple de BeautifulSoup4

Supposons qu'il existe un tel HTML, le contenu spécifique est. comme suit :

a_list = bs.find_all("a")
print(a_list)
Copier après la connexion

Créez des objets beautifulsoup4 :

import re 

t_list = bs.find_all(re.compile("a")) 
for item in t_list: 
   print(item)
Copier après la connexion
3. Quatre principaux types d'objets BeautifulSoup4

BeautifulSoup4 convertit des documents HTML complexes en une arborescence complexe. Chaque nœud est un objet Python. Tous les objets peuvent être résumés en 4 types : Tag, NavigableString , BeautifulSoup , Comment,

1. Tag : Tag

Tag est simplement une balise en HTML, par exemple : 🎜
t_list = bs.find_all(["meta","link"])
for item in t_list:
    print(item)
Copier après la connexion
🎜 On peut utiliser soup pour ajouter le nom de la balise afin d'obtenir facilement le contenu de ces balises et le types de ces objets Il s'agit de bs4.element.Tag. Mais notez qu'il recherche la première balise correspondante dans tout le contenu. 🎜🎜Pour Tag, il a 🎜deux attributs importants, qui sont le nom et les attributs : 🎜🎜
def name_is_exists(tag): 
    return tag.has_attr("name") 
t_list = bs.find_all(name_is_exists) 
for item in t_list: 
    print(item)
Copier après la connexion
Copier après la connexion
🎜2 NavigableString : le texte à l'intérieur de la balise🎜🎜Maintenant que nous avons le contenu de la balise, la question est, que faire. on veut ? Comment faire rentrer le texte à l'intérieur de l'étiquette ? C'est très simple, il suffit d'utiliser .string, par exemple : 🎜
t_list = bs.find_all(id="head")  # 查询id=head的Tag
t_list = bs.find_all(href=re.compile(http://news.baidu.com))  # 查询href属性包含ss1.bdstatic.com的Tag
t_list = bs.find_all(class_=True) # 查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
for item in t_list: 
    print(item)
Copier après la connexion
Copier après la connexion
🎜3 BeautifulSoup : Le contenu du document🎜🎜L'objet BeautifulSoup représente le contenu d'un document. La plupart du temps, il peut être considéré comme un objet Tag, qui est un Tag spécial. Nous pouvons obtenir respectivement son type, son nom et ses attributs, par exemple : 🎜
t_list = bs.find_all(data-foo="value")
Copier après la connexion
Copier après la connexion
🎜4 Commentaire : Commentaire🎜🎜L'objet Comment est un objet spécial. tapez l'objet NavigableString dont la sortie n'inclut pas de symboles de commentaire. 🎜
t_list = bs.find_all(attrs={"data-foo":"value"})
for item in t_list:
    print(item)
Copier après la connexion
Copier après la connexion
🎜4. Propriétés utilisées pour parcourir l'arborescence du document🎜
  • 🎜🎜.contents : 🎜Obtenir tous les nœuds enfants de Tag et renvoyer une liste🎜
  • < /ul >
    t_list = bs.find_all(text="hao123") 
    t_list = bs.find_all(text=["hao123", "地图", "贴吧"]) 
    t_list = bs.find_all(text=re.compile("\d"))
    Copier après la connexion
    Copier après la connexion
    • 🎜.🎜children : 🎜Obtenir tous les nœuds enfants de Tag et renvoyer un générateur🎜
    def length_is_two(text):
        return text and len(text) == 2
    t_list = bs.find_all(text=length_is_two)
    Copier après la connexion
    Copier après la connexion
    • 🎜🎜.descendants🎜 : Obtient tous les nœuds descendants de Tag🎜
    • 🎜🎜.parent🎜 : Récupère le nœud parent de Tag🎜
    • 🎜🎜 .parents🎜 : récupère de manière récursive tous les nœuds de l'élément parent et renvoie un générateur🎜
    • 🎜🎜.previous_sibling🎜 : récupère le nœud précédent de la balise actuelle. L'attribut est généralement une chaîne ou un espace. .Le résultat réel est le courant La virgule et le caractère de nouvelle ligne entre la balise et la balise précédente🎜
    • 🎜🎜.next_sibling🎜 : Obtenez le nœud suivant de la balise actuelle. L'attribut est généralement une chaîne ou un espace. . Le résultat est la balise actuelle et la suivante. La virgule et le caractère de nouvelle ligne entre une balise🎜
    • 🎜🎜.previous_siblings🎜 : récupère tous les nœuds frères au-dessus de la balise actuelle et renvoie un générateur🎜
    • .
    • 🎜🎜.next_siblings 🎜 : récupère tous les nœuds frères sous la balise actuelle et renvoie un générateur🎜
    • 🎜🎜.previous_element🎜 : récupère le dernier objet analysé (chaîne ou balise) pendant le processus d'analyse , qui peut être lié à previous_sibling Le même, mais généralement différent🎜
    • 🎜🎜.next_element🎜 : Obtenez le prochain objet analysé (chaîne ou balise) pendant le processus d'analyse, qui peut être le même que next_sibling, mais généralement différent 🎜
    • 🎜🎜.previous_elements🎜 : Renvoie un générateur qui peut accéder au contenu analysé du document forward 🎜
    • 🎜🎜.next_elements🎜 : Renvoie un générateur qui peut être accédé en arrière Le contenu analysé du document🎜
    • 🎜🎜.strings🎜 : Si Tag contient plusieurs chaînes, c'est-à-dire qu'il y a du contenu dans les nœuds descendants, vous pouvez l'utiliser pour l'obtenir, puis parcourir it🎜
    • 🎜🎜.stripped_strings🎜 : L'utilisation est la même que celle des chaînes, sauf que le contenu extra vierge peut être supprimé🎜
    • 🎜🎜.has_attr : 🎜Déterminez si la balise contient des attributs🎜
    🎜 5. Rechercher dans l'arborescence des documents🎜🎜1. find_all() : filter🎜🎜find_all(name, attrs, récursive, text, **kwargs) : Le filtre 🎜🎜find_all peut être utilisé dans le nom des balises, les attributs du nœud, etc. 🎜🎜(1) paramètre de nom : 🎜🎜🎜Filtrage de chaîne🎜 : trouvera le contenu qui correspond exactement à la chaîne🎜
    t_list = bs.find_all("a",limit=2)
    Copier après la connexion
    Copier après la connexion
    🎜🎜Filtrage d'expression régulière :🎜Si une expression régulière est transmise, BeautifulSoup4 recherchera ( ) pour correspondre au contenu 🎜
    # 下面两者是相等的
    t_list = bs.find_all("a") 
    t_list = bs("a") 
    
    # 下面两者是相等的
    t_list = bs.a.find_all(text="新闻") 
    t_list = bs.a(text="新闻")
    Copier après la connexion
    Copier après la connexion
    🎜🎜List🎜 : Si une liste est transmise, BeautifulSoup4 renverra le nœud qui correspond à n'importe quel élément de la liste🎜
    t_list = bs.find_all("title",limit=1) # 返回只有一个结果的列表
    t = bs.find("title") # 返回唯一值
    t = bs.find("abc") # 如果没有找到,则返回None
    Copier après la connexion
    Copier après la connexion
    🎜🎜Method🎜 : Transmettre une méthode et correspondre en fonction de la méthode🎜
    def name_is_exists(tag): 
        return tag.has_attr("name") 
    t_list = bs.find_all(name_is_exists) 
    for item in t_list: 
        print(item)
    Copier après la connexion
    Copier après la connexion
    (2)kwargs参数:
    t_list = bs.find_all(id="head")  # 查询id=head的Tag
    t_list = bs.find_all(href=re.compile(http://news.baidu.com))  # 查询href属性包含ss1.bdstatic.com的Tag
    t_list = bs.find_all(class_=True) # 查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
    for item in t_list: 
        print(item)
    Copier après la connexion
    Copier après la connexion
    (3)attrs参数:

    并不是所有的属性都可以使用上面这种方式进行搜索,比如HTML的data-*属性:

    t_list = bs.find_all(data-foo="value")
    Copier après la connexion
    Copier après la connexion

    如果执行这段代码,将会报错。我们可以使用attrs参数,定义一个字典来搜索包含特殊属性的tag:

    t_list = bs.find_all(attrs={"data-foo":"value"})
    for item in t_list:
        print(item)
    Copier après la connexion
    Copier après la connexion
    (4)text参数:

    通过text参数可以搜索文档中的字符串内容,与name参数的可选值一样,text参数接受 字符串,正则表达式,列表

    t_list = bs.find_all(text="hao123") 
    t_list = bs.find_all(text=["hao123", "地图", "贴吧"]) 
    t_list = bs.find_all(text=re.compile("\d"))
    Copier après la connexion
    Copier après la connexion

    当我们搜索text中的一些特殊属性时,同样也可以传入一个方法来达到我们的目的:

    def length_is_two(text):
        return text and len(text) == 2
    t_list = bs.find_all(text=length_is_two)
    Copier après la connexion
    Copier après la connexion
    (5)limit参数

    可以传入一个limit参数来限制返回的数量,当搜索出的数据量为5,而设置了limit=2时,此时只会返回前2个数据

    t_list = bs.find_all("a",limit=2)
    Copier après la connexion
    Copier après la connexion

    find_all除了上面一些常规的写法,还可以对其进行一些简写:

    # 下面两者是相等的
    t_list = bs.find_all("a") 
    t_list = bs("a") 
    
    # 下面两者是相等的
    t_list = bs.a.find_all(text="新闻") 
    t_list = bs.a(text="新闻")
    Copier après la connexion
    Copier après la connexion

    2、find()

    find()将返回符合条件的第一个Tag,有时我们只需要或一个Tag时,我们就可以用到find()方法了。当然了,也可以使用find_all()方法,传入一个limit=1,然后再取出第一个值也是可以的,不过未免繁琐。

    t_list = bs.find_all("title",limit=1) # 返回只有一个结果的列表
    t = bs.find("title") # 返回唯一值
    t = bs.find("abc") # 如果没有找到,则返回None
    Copier après la connexion
    Copier après la connexion

    从结果可以看出find_all,尽管传入了limit=1,但是返回值仍然为一个列表,当我们只需要取一个值时,远不如find方法方便。但是如果未搜索到值时,将返回一个None。

    在上面介绍BeautifulSoup4的时候,我们知道可以通过bs.div来获取第一个div标签,如果我们需要获取第一个div下的第一个div,我们可以这样:

    t = bs.div.div
    # 等价于
    t = bs.find("div").find("div")
    Copier après la connexion

    六、CSS选择器:select()方法

    BeautifulSoup支持部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag:

    print(bs.select(&#39;title&#39;))  # 1、通过标签名查找               
    print(bs.select(&#39;a&#39;))                                
    print(bs.select(&#39;.mnav&#39;))  # 2、通过类名查找                
    print(bs.select(&#39;#u1&#39;))  # 3、通过id查找                  
    print(bs.select(&#39;div .bri&#39;))  # 4、组合查找               
    print(bs.select(&#39;a[class="bri"]&#39;))  # 5、属性查找         
    print(bs.select(&#39;a[href="http://tieba.baidu.com" rel="external nofollow"  rel="external nofollow" ]&#39;)) 
    print(bs.select("head > title"))  # 6、直接子标签查找        
    print(bs.select(".mnav ~ .bri"))  # 7、兄弟节点标签查找       
    print(bs.select(&#39;title&#39;)[0].get_text())  # 8、获取内容
    Copier après la connexion

    七、综合实例:

    from bs4 import BeautifulSoup
    import requests,re
    req_obj = requests.get(&#39;https://www.baidu.com&#39;)
    soup = BeautifulSoup(req_obj.text,&#39;lxml&#39;)
    
    &#39;&#39;&#39;标签查找&#39;&#39;&#39;
    print(soup.title)              #只是查找出第一个
    print(soup.find(&#39;title&#39;))      #效果和上面一样
    print(soup.find_all(&#39;div&#39;))    #查出所有的div标签
    
    &#39;&#39;&#39;获取标签里的属性&#39;&#39;&#39;
    tag = soup.div
    print(tag[&#39;class&#39;])   #多属性的话,会返回一个列表
    print(tag[&#39;id&#39;])      #查找标签的id属性
    print(tag.attrs)      #查找标签所有的属性,返回一个字典(属性名:属性值)
    
    &#39;&#39;&#39;标签包的字符串&#39;&#39;&#39;
    tag = soup.title
    print(tag.string)                 #获取标签里的字符串
    tag.string.replace_with("哈哈")    #字符串不能直接编辑,可以替换
    
    &#39;&#39;&#39;子节点的操作&#39;&#39;&#39;
    tag = soup.head
    print(tag.title)     #获取head标签后再获取它包含的子标签
    
    &#39;&#39;&#39;contents 和 .children&#39;&#39;&#39;
    tag = soup.body
    print(tag.contents)        #将标签的子节点以列表返回
    print([child for child in tag.children])      #输出和上面一样
    
    
    &#39;&#39;&#39;descendants&#39;&#39;&#39;
    tag = soup.body
    [print(child_tag) for child_tag in tag.descendants]    #获取所有子节点和子子节点
    
    &#39;&#39;&#39;strings和.stripped_strings&#39;&#39;&#39;
    tag = soup.body
    [print(str) for str in tag.strings]             #输出所有所有文本内容
    [print(str) for str in tag.stripped_strings]    #输出所有所有文本内容,去除空格或空行
    
    &#39;&#39;&#39;.parent和.parents&#39;&#39;&#39;
    tag = soup.title
    print(tag.parent)                 #输出便签的父标签
    [print(parent) for parent in tag.parents]  #输出所有的父标签
    
    &#39;&#39;&#39;.next_siblings 和 .previous_siblings
        查出所有的兄弟节点
    &#39;&#39;&#39;
    
    &#39;&#39;&#39;.next_element 和 .previous_element
        下一个兄弟节点
    &#39;&#39;&#39;
    
    &#39;&#39;&#39;find_all的keyword 参数&#39;&#39;&#39;
    soup.find_all(id=&#39;link2&#39;)                   #查找所有包含 id 属性的标签
    soup.find_all(href=re.compile("elsie"))     #href 参数,Beautiful Soup会搜索每个标签的href属性:
    soup.find_all(id=True)                       #找出所有的有id属性的标签
    soup.find_all(href=re.compile("elsie"), id=&#39;link1&#39;)         #也可以组合查找
    soup.find_all(attrs={"属性名": "属性值"})  #也可以通过字典的方式查找
    Copier après la connexion

    八、BeautifulSoup 和lxml(Xpath)对比

    # test.py
    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup, SoupStrainer
    import traceback
    import json
    from lxml import etree
    import re
    import time
    
    def getHtmlText(url):
        try:
            r = requests.get(url, headers=headers)
            r.raise_for_status()
            if r.encoding == &#39;ISO-8859-1&#39;:
                r.encoding = r.apparent_encoding
            return r.text
        except:
            traceback.print_exc()
    
    # ----------使用BeautifulSoup解析------------------------
    def parseWithBeautifulSoup(html_text):
        soup = BeautifulSoup(html_text, &#39;lxml&#39;) 
        content = []
        for mulu in soup.find_all(class_=&#39;mulu&#39;): # 先找到所有的 div class=mulu 标记
            # 找到div_h3 标记
            h3 = mulu.find(&#39;h3&#39;)
            if h3 != None:
                h3_title = h3.string # 获取标题
                lst = []
                for a in mulu.select(&#39;div.box a&#39;):
                    href = a.get(&#39;href&#39;) # 找到 href 属性
                    box_title = a.get(&#39;title&#39;)  # 找到 title 属性
                    pattern = re.compile(r&#39;\s*\[(.*)\]\s+(.*)&#39;) # (re) 匹配括号内的表达式,也表示一个组
                    match = pattern.search(box_title)
                    if match != None:
                        date = match.group(1)
                        real_title = match.group(2)
                        lst.append({&#39;href&#39;:href,&#39;title&#39;:real_title,&#39;date&#39;:date})
                content.append({&#39;title&#39;:h3_title,&#39;content&#39;:lst})
        with open(&#39;dmbj_bs.json&#39;, &#39;w&#39;) as fp:
            json.dump(content, fp=fp, indent=4)
    
    # ----------使用Xpath解析------------------------
    def parseWithXpath(html_text):
        html = etree.HTML(html_text)
        content = []
        for div_mulu in html.xpath(&#39;.//*[@class="mulu"]&#39;): # 先找到所有的 div class=mulu 标记
            # 找到所有的 div_h3 标记
            div_h3 = div_mulu.xpath(&#39;./div[@class="mulu-title"]/center/h3/text()&#39;)
            if len(div_h3) > 0:
                h3_title = div_h3[0] # 获取标题
                a_s = div_mulu.xpath(&#39;./div[@class="box"]/ul/li/a&#39;)
                lst = []
                for a in a_s:
                    href = a.xpath(&#39;./@href&#39;)[0] # 找到 href 属性
                    box_title = a.xpath(&#39;./@title&#39;)[0] # 找到 title 属性
                    pattern = re.compile(r&#39;\s*\[(.*)\]\s+(.*)&#39;) # (re) 匹配括号内的表达式,也表示一个组
                    match = pattern.search(box_title)
                    if match != None:
                        date = match.group(1)
                        real_title = match.group(2)
                        lst.append({&#39;href&#39;:href,&#39;title&#39;:real_title,&#39;date&#39;:date})
                content.append({&#39;title&#39;:h3_title,&#39;content&#39;:lst})
        with open(&#39;dmbj_xp.json&#39;, &#39;w&#39;) as fp:
            json.dump(content, fp=fp, indent=4)
    
    def main():
        html_text = getHtmlText(&#39;http://www.seputu.com&#39;)
        print(len(html_text))
        start = time.clock()
        parseWithBeautifulSoup(html_text)
        print(&#39;BSoup cost:&#39;, time.clock()-start)
        start = time.clock()
        parseWithXpath(html_text)
        print(&#39;Xpath cost:&#39;, time.clock()-start)
    
    if __name__ == &#39;__main__&#39;:
        user_agent = &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36&#39;
        headers={&#39;User-Agent&#39;: user_agent}
        main()
    Copier après la connexion

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment exécuter des programmes dans Terminal Vscode Comment exécuter des programmes dans Terminal Vscode Apr 15, 2025 pm 06:42 PM

Dans VS Code, vous pouvez exécuter le programme dans le terminal via les étapes suivantes: Préparez le code et ouvrez le terminal intégré pour vous assurer que le répertoire de code est cohérent avec le répertoire de travail du terminal. Sélectionnez la commande Run en fonction du langage de programmation (tel que Python de Python your_file_name.py) pour vérifier s'il s'exécute avec succès et résoudre les erreurs. Utilisez le débogueur pour améliorer l'efficacité du débogage.

Le code Visual Studio peut-il être utilisé dans Python Le code Visual Studio peut-il être utilisé dans Python Apr 15, 2025 pm 08:18 PM

VS Code peut être utilisé pour écrire Python et fournit de nombreuses fonctionnalités qui en font un outil idéal pour développer des applications Python. Il permet aux utilisateurs de: installer des extensions Python pour obtenir des fonctions telles que la réalisation du code, la mise en évidence de la syntaxe et le débogage. Utilisez le débogueur pour suivre le code étape par étape, trouver et corriger les erreurs. Intégrez Git pour le contrôle de version. Utilisez des outils de mise en forme de code pour maintenir la cohérence du code. Utilisez l'outil de liaison pour repérer les problèmes potentiels à l'avance.

L'extension VScode est-elle malveillante? L'extension VScode est-elle malveillante? Apr 15, 2025 pm 07:57 PM

Les extensions de code vs posent des risques malveillants, tels que la cachette de code malveillant, l'exploitation des vulnérabilités et la masturbation comme des extensions légitimes. Les méthodes pour identifier les extensions malveillantes comprennent: la vérification des éditeurs, la lecture des commentaires, la vérification du code et l'installation avec prudence. Les mesures de sécurité comprennent également: la sensibilisation à la sécurité, les bonnes habitudes, les mises à jour régulières et les logiciels antivirus.

Peut-on exécuter le code sous Windows 8 Peut-on exécuter le code sous Windows 8 Apr 15, 2025 pm 07:24 PM

VS Code peut fonctionner sur Windows 8, mais l'expérience peut ne pas être excellente. Assurez-vous d'abord que le système a été mis à jour sur le dernier correctif, puis téléchargez le package d'installation VS Code qui correspond à l'architecture du système et l'installez comme invité. Après l'installation, sachez que certaines extensions peuvent être incompatibles avec Windows 8 et doivent rechercher des extensions alternatives ou utiliser de nouveaux systèmes Windows dans une machine virtuelle. Installez les extensions nécessaires pour vérifier si elles fonctionnent correctement. Bien que le code VS soit possible sur Windows 8, il est recommandé de passer à un système Windows plus récent pour une meilleure expérience de développement et une meilleure sécurité.

Python: automatisation, script et gestion des tâches Python: automatisation, script et gestion des tâches Apr 16, 2025 am 12:14 AM

Python excelle dans l'automatisation, les scripts et la gestion des tâches. 1) Automatisation: La sauvegarde du fichier est réalisée via des bibliothèques standard telles que le système d'exploitation et la fermeture. 2) Écriture de script: utilisez la bibliothèque PSUTIL pour surveiller les ressources système. 3) Gestion des tâches: utilisez la bibliothèque de planification pour planifier les tâches. La facilité d'utilisation de Python et la prise en charge de la bibliothèque riche en font l'outil préféré dans ces domaines.

Qu'est-ce que VScode pour quoi est VScode? Qu'est-ce que VScode pour quoi est VScode? Apr 15, 2025 pm 06:45 PM

VS Code est le code Visual Studio Nom complet, qui est un éditeur de code multiplateforme gratuit et open source et un environnement de développement développé par Microsoft. Il prend en charge un large éventail de langages de programmation et fournit une mise en surbrillance de syntaxe, une complétion automatique du code, des extraits de code et des invites intelligentes pour améliorer l'efficacité de développement. Grâce à un écosystème d'extension riche, les utilisateurs peuvent ajouter des extensions à des besoins et des langues spécifiques, tels que les débogueurs, les outils de mise en forme de code et les intégrations GIT. VS Code comprend également un débogueur intuitif qui aide à trouver et à résoudre rapidement les bogues dans votre code.

Comment utiliser vscode Comment utiliser vscode Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCODE) est un éditeur de code Open Source, Open Source et gratuit développé par Microsoft. Il est connu pour son léger, l'évolutivité et le support pour une large gamme de langages de programmation. Pour installer VScode, veuillez visiter le site officiel pour télécharger et exécuter l'installateur. Lorsque vous utilisez VSCODE, vous pouvez créer de nouveaux projets, modifier le code, déboguer le code, naviguer dans les projets, développer VSCODE et gérer les paramètres. VScode est disponible pour Windows, MacOS et Linux, prend en charge plusieurs langages de programmation et fournit diverses extensions via Marketplace. Ses avantages incluent le léger, l'évolutivité, le support linguistique étendu, les fonctionnalités riches et la version

L'avenir de HTML: évolution et tendances de la conception Web L'avenir de HTML: évolution et tendances de la conception Web Apr 17, 2025 am 12:12 AM

L'avenir de HTML est plein de possibilités infinies. 1) Les nouvelles fonctionnalités et normes comprendront plus de balises sémantiques et la popularité des composants Web. 2) La tendance de la conception Web continuera de se développer vers une conception réactive et accessible. 3) L'optimisation des performances améliorera l'expérience utilisateur grâce à des technologies de chargement d'image réactives et de chargement paresseux.

See all articles