Pythonウェブスクレイピング学習:正規表現とXPathの実践

データ分析:

·正規表現:

Test1(正規表現 - 文字列の分割):

コード:

import re

# 文字列を分割する
input_str = 'asdfsdfas'
# 's'を区切り文字として分割
regex_pattern = re.compile('s')
result = regex_pattern.split(input_str)
print(result)

出力:

['a', 'df', 'dfa', '']

Test2(正規表現 - 中国語のマッチング):

コード1:

# 中国語をマッチさせる
html_str = '<h2 tid="tid-YkerKe" id="hid-Htc8Nb">Test4(正規表現 - 純数字の正規表現):</h2>'

# Pythonで[a-z]のUnicode範囲をマッチさせる
pattern = re.compile('[\u4e00-\u9fa5]')
result = pattern.findall(html_str)
print(result)

中国語のマッチング### 出力1:

['正', '則', '表', '达', '式', '纯', '数', '字', '的', '正', '则']

コード2:

import re

# 中国語をマッチさせる
html_str = '<h2 tid="tid-YkerKe" id="hid-Htc8Nb">Test4(正規表現 - 純数字の正規表現):</h2>'

# Pythonで[a-z]のUnicode範囲をマッチさせる
pattern = re.compile('[\u4e00-\u9fa5]+')
result = pattern.findall(html_str)
print(result)

出力2:

['正則表達式', '純數字的正則']

Test3(正規表現 - ウェブサイトのスクレイピング):

コード:

import re
import requests

url = 'https://news.baidu.com/'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"
}
response = requests.get(url, headers=headers)
html_content = response.content.decode()
with open('02news.html', 'w', encoding='utf-8') as f:
    f.write(html_content)

出力:

Test4:(正規表現 - ニュースページの単純なスクレイピング):

コード1:

# coding=gbk
import re
import requests

url = 'https://news.baidu.com/'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"
}
response = requests.get(url, headers=headers)
html_content = response.content.decode()

# '<a href="http://politics.people.com.cn/n1/2021/0303/c1001-32040808.html" target="_blank" class="a3" mon="ct=1&amp;a=1&amp;c=top&amp;pn=0">人民的信心和支持就是我们国家奋进的力量</a>'
pattern = re.compile(r'<a href="(.*?)" target="_blank" mon="(.*?)">(.*?)</a>')
result = pattern.findall(html_content)
print(result)

出力1:

コード2:

# coding=gbk
import re
import requests

url = 'https://news.baidu.com/'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"
}
response = requests.get(url, headers=headers)
html_content = response.content.decode()

# '<a href="http://politics.people.com.cn/n1/2021/0303/c1001-32040808.html" target="_blank" class="a3" mon="ct=1&amp;a=1&amp;c=top&amp;pn=0">人民的信心和支持就是我们国家奋进的力量</a>'
# pattern = re.compile('<a(.*?)</a>')
result = pattern.findall(html_content)
print(result)

出力2:

·XPath:

Test1(XPathの基本的使用法):

コード:

# coding=gbk
import re
import requests
from lxml import etree

url = 'https://news.baidu.com/'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"
}
response = requests.get(url, headers=headers)
html_content = response.content.decode()
# 1.解析対象の型に変換
parsed_html = etree.HTML(html_content)
# XPath
# 2.XPathメソッドを呼び出す
result1 = parsed_html.xpath('/html/head/title/text()')
result2 = parsed_html.xpath('//a/text()')
result3 = parsed_html.xpath('//a[@mon="ct=1&a=1&c=top&pn=0"]/text()')
result4 = parsed_html.xpath('//a[@mon="ct=1&a=1&c=top&pn=0"]/@href')
result5 = parsed_html.xpath('//li/a/text()')

print(result1)
print(result2)
print(result3)
print(result4)
print(result5)

出力:

注釈:

XPath構文:
1.ノード: /
2.跨ノード://
3.正確なタグ://a[@属性="属性値"]
4.タグで囲まれた内容 /text()
5.属性:@href
6.XPathが返すデータ型 —— List
XPathのインデックスは1から始まります。平階層のタグのみを取得できます。

Test2(実践):

https://www.cnblogs.com/3cH0-Nu1L/default.html?page=を例にします77

コード:

# coding=gbk
import requests
from lxml import etree


class BkySpider:
    def __init__(self):
        self.base_url = 'https://www.cnblogs.com/3cH0-Nu1L/default.html?page='
        self.headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36"
    }
    # 1.リクエストを送信する
    def fetch_response(self, url):
        response = requests.get(url, headers=self.headers)
        html_data = response.content.decode()
        return html_data
    # 2.データを解析する
    def parse_content(self, html_data):
        # XPathを使用して現在のページのすべての記事タイトルを解析する
        # 1.型に変換
        parsed_doc = etree.HTML(html_data)
        # 2.XPathパスに基づいて解析する
        title_list = parsed_doc.xpath('//a[@class="postTitle2 vertical-middle"]/text()')
        url_list = parsed_doc.xpath('//a[@class="postTitle2 vertical-middle"]/@href')
        print(title_list)

    # 3.データを保存する
    def save_file(self, html_data):
        with open('05bky.html', 'w', encoding='utf-8') as f:
            f.write(html_data)

    # 4.実行
    def execute(self):
        # 1.完全なURLを結合する
        url = f"{self.base_url}2"
        # 2.リクエストを送信する
        html_data = self.fetch_response(url)
        # 3.解析を行う
        self.parse_content(html_data)
        # 4.保存する
        #self.save_file(html_data)


BkySpider().execute()

タグ: Python 正規表現 XPath ウェブスクレイピング

5月30日 20:51 投稿