Еще один мощный инструмент для анализа данных сканера: Xpath.

рептилия

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Мощный XPath

Когда раньше поисковые роботы анализировали данные, они почти всегда использовали регулярные выражения. Обычный анализ данных является мощным средством, но выражения громоздки для написания и относительно медленны. В этой статье описывается, как быстро начать работу с инструментом анализа данных: Xpath.

Введение в XPath

XPath (XML Path)это язык для поиска информации в документах XML.XPathдоступно вXMLПеребирает элементы и атрибуты в документе.

XPath является основным элементом стандарта W3C XSLT, а XQuery и XPointer построены на выражениях XPath.

  • Xpath — это язык запросов.
  • Найти узлы в XML (язык расширенной разметки) и конструкции HTML
  • XPATH — это язык для «поиска людей» на основе «адресов».

Сайт быстрого старта:Woohoo. Я 3schools.com/XML/default…

Установка XPath

Установка на MacOS очень проста:

pip install lxml

Установка в Linux Возьмите Ubuntu в качестве примера:

sudo apt-get install python-lxml

Для установки в Windows, пожалуйста, Baidu самостоятельно.Там определенно будут учебники, но процесс будет относительно хлопотным.

Как я могу убедиться, что установка прошла успешно? в командной строкеimport lxmlЕсли об ошибке не сообщается, установка прошла успешно!

Принцип парсинга Xpath

  • Создайте экземпляр объекта синтаксического анализа etree, и вам необходимо загрузить исходные данные проанализированной страницы в объект.
  • Вызов метода синтаксического анализа xpath в xpath в сочетании с выражениями xpath для позиционирования меток и захвата содержимого.

Как создать экземпляр объекта Etree?

  1. Загрузите исходные данные в локальном html-документе в объект etree: etree.parse(filePath)
  2. Загрузите исходные данные, полученные в Интернете, в объект: etree.HTML('page_text'), где page_text относится к полученному нами исходному контенту

Как использовать XPath

3 специальных символа

  • /: указывает, что синтаксический анализ начинается с корневого узла, и это один уровень, который постепенно позиционируется
  • //: указывает на несколько уровней, некоторые из которых можно пропустить; также означает позиционирование с любой позиции
  • .: точка представляет текущий узел

Общие выражения пути

Ниже приведены общие выражения пути Xpath:

выражение описывать
nodename Выбирает все дочерние узлы этого узла.
/ Выберите из корневого узла.
// Выбирает узлы в документе из текущего узла, который соответствует выбору, независимо от их положения.
. Выберите текущий узел.
Выберите родительский узел текущего узла.
@ Выберите свойства.

Пример

выражение инструкция
books Выбирает все дочерние элементы элемента books
/books Выберите книжный магазин корневого элемента
books//title Выбирает все элементы заголовка, которые являются дочерними элементами книг
//price выбрать все ценовые элементы
books/book[3] Выберите 3-й элемент книги, который принадлежит дочернему элементу книги, индекс начинается с 1
/bookstore/book[price>55.0] Выберите все элементы книги с ценой за единицу выше 55.
//@category Выберите все свойства с именем категории
/books/book/title/text() Выделить все значения заголовков документа

Операторы Xpath

Операторы напрямую поддерживаются в выражениях Xpath:

Operator Description Example Chinese
| Computes two node-sets //book | //cd Объединить два результата
+ Addition 6 + 4 добавлять
- Subtraction 6 - 4 уменьшать
* Multiplication 6 * 4 брать
div Division 8 div 4 Удалить
= Equal price=9.80 равный
!= Not equal price!=9.80 не равно
< Less than price<9.80 меньше, чем
<= Less than or equal to price<=9.80 меньше или равно
> Greater than price>9.80 больше, чем
>= Greater than or equal to price>=9.80 больше или равно
or or price=9.80 or price=9.70 или
and and price>9.00 and price<9.90 и
mod Modulus (division remainder) 5 mod 2 Излишек

HTML-элемент

Элемент HTML относится ко всему коду от начального тега до конечного тега. Основной синтаксис:

  • Элементы HTML начинаются сстартовая вкладкаНачало; элемент HTML заканчивается закрывающим тегом
  • Содержимое элемента — это содержимое между открывающим и закрывающим тегами.
  • Некоторые элементы HTML имеют пустое содержимое
  • Пустые элементы закрываются открывающим тегом (оканчивающимся в конце открывающего тега)
  • Большинство HTML-элементов могут иметь атрибуты; для атрибутов рекомендуется использовать строчные буквы.

Что касается использования пустых элементов: добавьте косую черту к открывающему тегу, например <br />, является правильным способом закрытия пустых элементов и поддерживается HTML, XHTML и XML.

Общие свойства

Атрибуты ценность описывать
class classname Указывает имя класса элемента (имя класса)
id id Указывает уникальный идентификатор элемента
style style_definition Определяет встроенный стиль элемента
title text Указывает дополнительную информацию для элемента (может отображаться во всплывающей подсказке)

HTML-заголовок

В HTML существует 6 уровней заголовков.

Заголовок через<h1> - <h6>определяется этикеткой.

<h1>определить самый большой заголовок,<h6>Определите самый маленький заголовок.

Анализ случая

необработанные данные

Прежде чем анализировать данные с помощью Xpath, нам нужно импортировать библиотеку и создать экземпляр объекта etree:

# 导入库
from lxml import etree

# 实例化解析对象
tree = etree.parse("test.html")
tree

Ниже приведены исходные данные test.html для анализа:

  1 <html lang="en">
  2 <head>
  3     <meta charset="UTF-8" />
  4     <title>古代诗人及作品</title>
  5 </head>
  6 <body>
  7     <div>
  8         <p>诗人姓名</p>
  9     </div>
 10     <div class="name">
 11         <p>李白</p>
 12         <p>白居易</p>
 13         <p>李清照</p>
 14         <p>杜甫</p>
 15         <p>王安石</p>
 16         <a href="http://wwww.tang.com" title="李世民" target="_self">
 17             <span> this is span </span>
 18         古代诗人写的诗词真的非常棒</a>
 19         <a href="" class="du">床前明月光,疑是地上霜</a>
 20         <img src="http://www.baidu.com/tang.jpg" alt="" />
 21     </div>
 22     <div class="tang">
 23         <ul>
 24             <li><a href="http://www.baidu.com" title="百度">朝辞白帝彩云间,千里江陵一日还</a></li>
 25             <li><a href="http://www.sougou.com" title="搜狗">清明时节雨纷纷,路上行人欲断魂</a></li>
 26             <li><a href="http://www.360.com" alt="360">秦时明月汉时关,万里长征人未还</a></li>
 27             <li><a href="http://www.sina.com" title="必应">君子赠人以言,庶人赠人以财</a></li>
 28             <li><b>苏轼</b></li>
 29             <li><i>苏洵</i></li>
 30             <li><a href="http://www.google.cn" id="谷歌">欢迎使用谷歌浏览器</a></li>
 31         </ul>
 32     </div>
 33 </body>
 34 </html>                     

Получить содержимое одной метки

Например, если вы хотите получить содержимое тега title: древние поэты и произведения

title = tree.xpath("/html/head/title")
title

Благодаря приведенным выше результатам обнаружено, что результатом каждого синтаксического анализа Xpath является список

Если вы хотите получить текстовое содержимое метки, используйте text():

# 从列表中提取相应内容

title = tree.xpath("/html/head/title/text()")[0]  # 索引0表示取得第一个元素值
title

Получить несколько содержимого внутри тега

Например, если мы хотим получить содержимое тега div, в исходных данных есть 3 пары тегов div, и в результате список содержит 3 элемента:

1. Использование одинарной косой черты /: указывает, что корневой узел начинает поиск html, указывая уровень

2. Используйте двойную косую черту посередине //: указывает на пропуск среднего уровня, указывая на несколько уровней.

3. Используйте двойную косую черту в начале //: означает начало с любой позиции

таргетинг по атрибутам

При использовании позиционирования атрибута следуйте сразу после метки[@属性名="属性值"]:

name = tree.xpath('//div[@class="name"]')   # 定位class属性,值为name
name

Позиционирование индекса

Индекс в Xpath начинается с 1, что отличается от индекса в python, который начинается с 0. Например, если вы хотите найти все теги p в атрибуте class (имя значения) под тегом div: 5 пар тегов p, результатом должно быть 5 элементов.

# 获取全部数据

index = tree.xpath('//div[@class="name"]/p')
index

Если мы хотим получить в нем 3-й тег p:

# 获取单个指定数据:索引从1开始

index = tree.xpath('//div[@class="name"]/p[3]')  # 索引从1开始
index

получить текстовое содержимое

Первый метод: метод text()

1. Получить элементы под определенным тегом:

# 1、/:单个层级
class_text = tree.xpath('//div[@class="tang"]/ul/li/b/text()')
class_text
# 2、//:多个层级
class_text = tree.xpath('//div[@class="tang"]//b/text()')
class_text

2. Множественный контент под тегом

Например, если вы хотите получить все содержимое ниже тега p:

# 获取全部数据

p_text = tree.xpath('//div[@class="name"]/p/text()')
p_text

Например, если вы хотите получить содержимое под третьим тегом p:

# 获取第3个标签内容

p_text = tree.xpath('//div[@class="name"]/p[3]/text()')  
p_text

Если вы сначала получите весь контент в теге p, результатом будет список, а затем используйте индекс Python для его получения.Обратите внимание, что индекс равен 2:

Доступ к прямому контенту без ярлыка:

Получение прямого содержимого метки: результат пустой, а в метке прямого li содержимого нет

Если вы хотите получить все содержимое тега li, вы можете объединить следующие теги a, b, i и использовать вертикальную черту.|

# 同时获取li标签下面a/b/i标签的内容,相当于是li标签全部的内容

abi_text = tree.xpath('//div[@class="tang"]//li/a/text() | //div[@class="tang"]//li/b/text() | //div[@class="tang"]//li/i/text()')
abi_text

Непосредственное и косвенное понимание

получить содержимое атрибута

Если вы хотите получить значение атрибута, добавьте: @ + имя атрибута к последнему выражению, вы можете получить значение соответствующего атрибута

1. Получить значение одного атрибута

2. Получить несколько значений атрибутов

Начало и включение атрибутов

XPath поддерживает создание выражений XPath, начинающихся с определенных строк или содержащих определенные символы.В Xpath нет выражений, заканчивающихся строками.

  • Старт: Начинается с
  • содержит: содержит

Синтаксис можно записать так:

//标签[starts-with(@属性名,"相同部分的字符串")]
//标签[conatians(@属性名,"相同部分的字符串")]

1. Начните со строки

Получите текстовое содержимое под href, начиная с http под тегом a

2. Содержит строки

Атрибут title под тегом a содержит текстовое содержимое Baidu:

Суммировать

Вот краткое изложение использования Xpath:

  • //: Указывает, что получено непрямое содержимое метки и есть уровни охвата
  • /: указывает, что получено только прямое содержимое метки, и оно не пересекает иерархию.
  • Если индекс находится в выражении Xpath, индекс начинается с 1; если данные списка получены из выражения Xpath, а затем для выборки числа используется индекс python, индекс начинается с 0

реальный бой

Используйте XPATH для сканирования всех новых имен (имя) и URL-адресов (url) Гу Луна на веб-сайте романа.

Его настоящее имя Сюн Яохуа, уроженец Цзянси, он окончил колледж Тамкан Инь (предшественник Тамканского университета) на Тайване. В молодости он увлекался чтением древних и современных романов о боевых искусствах и западных литературных произведений.Принято считать, что он был вдохновлен влиянием Йошикавы Эйдзи, Дюма, Хемингуэя, Джека Лондона, Стейнбека и даже Ницше, Саудовской Аравии. Аравия и другие западные философии. (Сам Гу Лун также сказал: «Мне нравится «воровать трюки» из современных японских и западных романов».) Поэтому это может быть все новым и новым, и оно наверстает упущенное позже, а не откроет новое царство боевых искусств. романы об искусстве.

Анализ веб-данных

Соскобленная информация находится на этом сайте:воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооу

Когда мы нажимаем на конкретный роман, например «Бесподобная двойная гордость», мы можем ввести конкретную информацию о романе:

Просмотрев исходный код веб-страницы, мы обнаружили, что имя и URL-адрес находятся в следующих тегах:

Под каждым тегом tr есть 3 тега td, представляющие 3 романа, один td содержит адрес и имя.

Получить исходный код веб-страницы

Отправьте запрос веб-страницы, чтобы получить исходный код

import requests
from lxml import etree 
import pandas as pd

url = 'https://www.kanunu8.com/zj/10867.html'
headers = {'user-agent': '请求头'}

response = requests.get(url = url,headers = headers)
result = response.content.decode('gbk')   # 该网页需要通过gbk编码来解析数据
result 

получение информации

1. Получите эксклюзивный адрес ссылки каждого романа

tree = etree.HTML(result)

href_list = tree.xpath('//tbody/tr//a/@href')  # 指定属性的信息
href_list[:5]

2. Получите название каждого романа

name_list = tree.xpath('//tbody/tr//a/text()')  # 指定标签下面的全部内容
name_list[:5]

3. Создайте фрейм данных DataFrame

# 生成古龙小说的地址和名称

gulong = pd.DataFrame({
    "name":name_list,
    "url":href_list 
})

gulong

4. Улучшите URL-адрес

Фактически, URL-адрес каждого романа имеет префикс, такой как полный адрес несравненного двойного прайда:www.kanunu8.com/book/4573/

gulong['url'] = 'https://www.kanunu8.com/book' + gulong['url']   # 加上公共前缀
gulong

# 导出为excel文件
gulong.to_excel("gulong.xlsx",index=False)