Общественный номер: 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?
- Загрузите исходные данные в локальном html-документе в объект etree: etree.parse(filePath)
- Загрузите исходные данные, полученные в Интернете, в объект: 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)