Teknologian jakaminen

[Indeksointirobotti] Analysoi indeksoidut tiedot

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Aiemman BeautifulSoup-kirjaston lisäksi tietojen jäsentämiseen on kaksi menetelmää: säännölliset lausekkeet ja Xpath.

1. Säännölliset lausekkeet

Säännölliset lausekkeet (lyhyesti RE) ovat työkaluja, joita käytetään merkkijonomallien kuvaamiseen ja sovittamiseen.

Sitä käytetään laajasti tekstinkäsittelyssä, tietojen validoinnissa, tekstin haussa ja korvaamisessa ja muissa skenaarioissa. Säännölliset lausekkeet käyttävät erityistä syntaksia, joka mahdollistaa monimutkaisen kuvion sovituksen merkkijonoissa.

Säännöllisen lausekkeen testi:Online-säännöllinen lauseketesti

1. Yleisesti käytetyt metamerkit

Metamerkit: Erikoissymbolit, joilla on kiinteä merkitys. Jokainen metamerkki vastaa oletusarvoisesti vain yhtä merkkijonoa, eikä se voi vastata rivinvaihtomerkkejä.

MetahahmotkuvataEsimerkki
.Vastaa mitä tahansa merkkiä paitsi rivinvaihtojaa.b voi sopiaa1bacb
wYhdistä kirjaimet, numerot tai alaviivatw+ otteluhelloworld_123
sVastaa mitä tahansa välilyöntiäs+ Vastaa välilyöntejä, sarkaimia jne.
dVastaa numeroitad+ ottelu123456
nVastaa rivinvaihtomerkkiähellonworld Yhdistä rivinvaihtomerkki
tvastaa sarkainmerkkiähellotworld vastaa sarkainmerkkiä
^Vastaa merkkijonon alkua^Hello otteluHello merkkijono alussa
$Yhdistä merkkijonon loppuWorld$ otteluWorld merkkijonon loppu
WVastaa muita kuin kirjaimia, ei-numeroita ja ei-alaviivoja merkkejäW+ ottelu!@#$%^
DVastaa ei-numeerisia merkkejäD+ otteluabcXYZ
SKäytä muita kuin välilyöntejäS+ otteluhelloworld123
`ab`Yhdistä hahmoja a tai hahmob
(...)Sieppaa lausekkeen sulkeissa edustaen ryhmää(abc) kaapataabc
[...]Vastaa mitä tahansa merkkiä hakasulkeissa[abc] otteluab taic
[^...]Vastaa mitä tahansa merkkiä, jota ei ole suljettu hakasulkeisiin[^abc] ottelu paitsiabc Mikä tahansa muu hahmo kuin

2. Kvantifioija

Quantifier: ohjaa edellisen metamerkin esiintymisten määrää

kvantorikuvata
*Toista nolla tai useampia kertoja
+Toista yksi tai useampia kertoja
?Toista nolla tai kerran
{n}Toista n kertaa
{n,}Toista n tai useammin
{n,m}Toista n - m kertaa

laiska sovitus.*? : Yhdistä mahdollisimman vähän merkkejä.Lisää toistuvien metamerkkien jälkeen? Toteuta laiska sovitus.
ahne yhteensopivuus.* : Yhdistä mahdollisimman monta hahmoa. Oletuksena toistuvat metamerkit ovat ahneita.

laiska sovitus

ahne yhteensopivuus

3.Re-moduuli

Voit käsitellä säännöllisiä lausekkeita Pythonissa käyttämällä re Tämä moduuli tarjoaa joukon toimintoja merkkijonojen etsimiseen, sovittamiseen ja käsittelyyn.

toimintokuvata
re.search(pattern, string, flags=0)Hae merkkijonoa ja palauta ensimmäinen vastaava objekti, jos hakua ei löydy None
re.match(pattern, string, flags=0)Yhdistä kuvio merkkijonon alusta, jos täsmääminen onnistuu, palauta vastaava objekti None
re.fullmatch(pattern, string, flags=0)Palauttaa hakuobjektin, jos koko merkkijono vastaa kuviota tarkasti, muussa tapauksessa se palauttaa None
re.findall(pattern, string, flags=0)Palauttaa luettelon kaikista merkkijonon ei-päällekkäisistä vastaavuuksista
re.finditer(pattern, string, flags=0)Palauttaa iteraattorin kaikista merkkijonon ei-päällekkäisistä osumista
re.sub(pattern, repl, string, count=0, flags=0)Vaihda kaikki vastaavan kuvion osat korvaavalla merkkijonolla ja palauta korvattu merkkijono
re.split(pattern, string, maxsplit=0, flags=0)Jaa merkkijono kaavavastaavuuden perusteella ja palauta jakoluettelo
import re

# 示例文本
text = "在2024年,Python是最受欢迎的编程语言之一。Python 3.9版本在2020年发布。"

# 1. re.search() 搜索字符串,返回第一个匹配的对象
# 查找第一个数字序列
search_result = re.search(r'd+', text)
if search_result:
    print(f"re.search: 找到的第一个数字是 '{search_result.group()}',位置在 {search_result.start()}")  

# 2. re.match() 从字符串起始位置匹配模式
# 匹配字符串开头是否为 '在'
match_result = re.match(r'在', text)
if match_result:
    print(f"re.match: 匹配的字符串是 '{match_result.group()}',位于字符串的开始")

# 3. re.fullmatch() 整个字符串完全匹配模式
# 检查整个字符串是否只包含中文字符
fullmatch_result = re.fullmatch(r'[u4e00-u9fff]+', '在编程')
if fullmatch_result:
    print(f"re.fullmatch: 整个字符串完全匹配,匹配到的内容是 '{fullmatch_result.group()}'")  

# 4. re.findall() 返回字符串中所有非重叠匹配的列表
# 查找所有的数字序列
findall_result = re.findall(r'd+', text)
print(f"re.findall: 找到的所有数字序列是 {findall_result}") 

# 5. re.finditer() 返回字符串中所有非重叠匹配的迭代器
# 查找所有的数字序列,并逐一输出
finditer_result = re.finditer(r'd+', text)
for match in finditer_result:
    print(f"re.finditer: 找到的数字是 '{match.group()}',位置在 {match.start()}")  

# 6. re.sub() 用替换字符串替换匹配模式的所有部分
# 将所有数字替换为 '#'
sub_result = re.sub(r'd+', '#', text)
print(f"re.sub: 替换后的字符串是: {sub_result}") 

# 7. re.split() 根据模式匹配分割字符串
# 按照空白字符或标点分割字符串
split_result = re.split(r'[,。 ]+', text)
print(f"re.split: 分割后的字符串列表是: {split_result}") 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

kuva-20240608195856954

4. Crawl Douban -elokuvat

kuva-20240608200527961

alkaen<li>Aloita tunnisteesta, yhdistä asteittain elokuvan nimen sisältävään tagiin<span class="title">tag, käytä ei-ahnetilaa (.*?) vastaa mitä tahansa merkkejä, jotka voivat olla niiden välissä, kunnes seuraava eksplisiittinen merkki löytyy, käyttämällä nimettyä kaappausryhmää(?P<name>)Pura elokuvan nimiosa.

Re ilmaisun kirjoittaminen:

<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>
  • 1

Indeksointikoodi:

import requests
import re
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

for start_num in range(0, 250, 25):
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
    # 拿到页面源代码
    html = response.text
    # 使用re解析数据
    obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>',re.S)
    # 开始匹配
    result = obj.finditer(html)
    # 打印结果
    for it in result:
        print(it.group('name'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2. Xpath

Xpath on kieli XML-dokumenteista etsimiseen. Se voi valita solmuja tai solmujoukkoja polkulausekkeiden avulla.

Asenna lxml-moduuli: pip install lxml

1. Xpath-analyysi

Ⅰ Solmun valinta

symboliselittää
/Valitse juurisolmusta.
//Valitsee asiakirjan solmut nykyisestä valintaa vastaavasta solmusta niiden sijainnista riippumatta.
.Valitse nykyinen solmu.
..Valitsee nykyisen solmun pääsolmun.
@Valitse ominaisuudet.

ilmaisuselittää
/bookstore/bookValitse kaikki kirjan alisolmut kirjakauppasolmun alta.
//bookValitsee asiakirjan kaikki kirjasolmut niiden sijainnista riippumatta.
bookstore/book[1]Valitse ensimmäinen kirjan alisolmu kirjakauppasolmun alta.
//title[@lang]Valitse kaikki otsikon solmut, joissa on lang-attribuutti.
//title[@lang='en']Valitse kaikki otsikkosolmut, joiden lang-attribuutti on "en".

Ⅲ Yleisesti käytetyt toiminnot

  • text(): Valitse elementin teksti.
  • @attr: Valitse elementin attribuutti.
  • contains(): Määritä inkluusiosuhde.
  • starts-with(): Tuomion alku.
from lxml import etree

html_content = '''
<html>
  <body>
    <div class="movie">
      <span class="title">肖申克的救赎</span>
      <span class="title">The Shawshank Redemption</span>
    </div>
    <div class="movie">
      <span class="title">霸王别姬</span>
      <span class="title">Farewell My Concubine</span>
    </div>
  </body>
</html>
'''

# 解析HTML
tree = etree.HTML(html_content)

# 提取电影标题
titles_cn = tree.xpath('//div[@class="movie"]/span[@class="title"][1]/text()')
titles_en = tree.xpath('//div[@class="movie"]/span[@class="title"][2]/text()')

# 打印结果
for cn, en in zip(titles_cn, titles_en):
    print(f'中文标题: {cn}, 英文标题: {en}')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
//div[@class="movie"]/span[@class="title"][1]/text()
  • 1

//div[@class="movie"]: Valitse kaikki luokat nimellämoviediv-elementti.

/span[@class="title"][1]: Valitse luokka kussakin div astitleEnsimmäinen jänne-elementti.

/text(): Hae span-elementin tekstisisältö.

//div[@class="movie"]/span[@class="title"][2]/text()
  • 1

Samanlainen kuin yllä oleva lauseke, mutta kunkin div:n luokka on valittu.titleToinen jänne-elementti.

2. Crawl Douban -elokuvat

Douban

import requests
from lxml import etree

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

for start_num in range(0, 250, 25):
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
    # 拿到页面源代码
    html = response.text
    # 使用lxml解析页面
    html = etree.HTML(html)
    # 提取电影名字
    titles = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
    # 提取评分
    ratings = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
    # 打印结果
    for title, rating in zip(titles, ratings):
        print(f"电影: {title} 评分: {rating}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20