Скрапиране

Скрапиране с XPath селектори

Скрапиране с XPath селектори
HTML е езикът на уеб страниците и между отварянето и затварянето на всяка уеб страница има много информация html етикет. Има много начини за достъп до това, но в тази статия бихме го направили, като използваме селектора Xpath чрез библиотеката Scrapy на Python.

Библиотеката Scrapy е много мощна библиотека за изстъргване в мрежата, лесна за използване. Ако не сте запознати с това, можете да следвате наличния урок за използване на библиотеката Scrapy.

Този урок обхваща използването на селектори на Xpath. Xpath използва синтаксис като път за навигация във възлите на XML документи. Те са полезни и при навигация в HTML тагове.

За разлика от урока по Scrapy, ние ще правим всички наши операции тук на терминала за по-голяма простота. Това не означава, че Xpath не може да се използва с правилната програма Scrapy, но те могат да бъдат използвани в библиотеката за синтактичен анализ на параметъра за отговор.

Ще работим с примера.webscraping.com сайт, тъй като е много прост и би помогнал за разбирането на концепциите.

За да използвате скрап в нашия терминал, въведете командата по-долу:

$ scrapy черупка http: // пример.webscraping.com

Той ще посети сайта и ще получи необходимата информация, след което ще ни остави интерактивна обвивка, с която да работим. Трябва да видите подкана като:

В [1]:

От интерактивната сесия ще работим с отговор обект.

Ето как би изглеждал нашият синтаксис за по-голямата част от тази статия:

В [1]: отговор.xpath ('xpathsyntax').екстракт()

Тази команда по-горе се използва за извличане на всички съвпадащи тагове според синтаксиса Xpath и след това го съхранява в списък.

В [2]: отговор.xpath ('xpathsyntax').извличане_първо ()

Тази команда по-горе се използва за извличане само на първия съвпадащ маркер и го съхранява в списък.
Вече можем да започнем работа по синтаксиса на Xpath.

НАВИГАЦИОННИ ЕТИКЕТИ

Навигирането в таговете в Xpath е много лесно, необходимо е само наклонената черта „/“, последвана от името на маркера.

В [3]: отговор.xpath ('/ html').екстракт()

Командата по-горе ще върне html таг и всичко, което съдържа като единичен елемент в списък.

Ако искаме да получим тялото на уеб страницата, ще използваме следното:

В [4]: ​​отговор.xpath ('/ html / body').екстракт()

Xpath също така позволява заместващия знак „*“, който съответства на всичко на нивото, в което се използва.

В [5]: отговор.xpath ('/ *').екстракт()

Кодът по-горе ще съответства на всичко в документа. Същото се случва, когато използваме '/ html'.

В [6]: отговор.xpath ('/ html / *').екстракт()

Освен навигацията по маркери, ние можем да получим всички низходящи тагове на определен маркер, като използваме „//“.

В [7]: отговор.xpath ('/ html // a').екстракт()

Горният код ще върне всички анкерни маркери в html тагове i.д. щеше да върне списък на всички низходящи котва тагове.

ЕТИКЕТИ ПО Атрибути и техните стойности

Понякога навигирането в html тагове, за да стигнете до необходимия маркер, може да бъде проблем. Тази неприятност може да бъде предотвратена чрез просто намиране на необходимия маркер по неговия атрибут.

В [8]: отговор.xpath ('/ html // div [@id = "pagination"]').екстракт()

Кодът по-горе връща всички div етикети под html етикет, който има документ за самоличност атрибут със стойност пагинация.

В [9]: отговор.xpath ('/ html // div [@class = "span12"]').екстракт()

Кодът по-горе ще върне списък с всички div тагове под маркера html, само ако имат атрибут class със стойност span12.

Ами ако не знаете стойността на атрибута? И всичко, което искате, е да получите маркери с определен атрибут, без да се притеснявате за неговата стойност. Това също е лесно, всичко, което трябва да направите, е да използвате само символа @ и атрибута.

В [10]: отговор.xpath ('/ html // div [@class]').екстракт()

Този код ще върне списък с всички div тагове, които съдържат атрибута class, независимо от това каква стойност притежава този атрибут class.

Какво ще кажете, ако знаете само няколко знака, съдържащи се в стойността на атрибут? Също така е възможно да получите такива маркери.

В [11]: отговор.xpath ('/ html // div [съдържа (@id, "йон")]').екстракт()

Кодът по-горе ще върне всички div тагове под html таговете, които имат атрибут id, но не знаем каква стойност притежава атрибутът, освен че знаем, че съдържа „йон“.

Страницата, която анализираме, има само един маркер в тази категория и стойността е „pagination“, така че тя ще бъде върната.

Готино дясно?

ЕТИКЕТИ ПО ТЕКСТА

Не забравяйте, че сравнявахме етикетите по техните атрибути по-рано. Също така можем да съпоставим таговете по техния текст.

В [12]: отговор.xpath ('/ html // a [.= "Алжир"] ').екстракт()

Кодът по-горе ще ни помогне да получим всички анкерни тагове, които съдържат текста „Алжир“. NB: Трябва да са маркери с точно това текстово съдържание.

Чудесен.

Какво ще кажете, ако не знаем точното текстово съдържание и знаем само някои от текстовото съдържание? Можем да направим и това.

В [13]: отговор.xpath ('/ html // a [съдържа (текст (), "A")]').екстракт()

Кодът по-горе ще получи етикетите, които съдържат буквата „А“ в текстовото си съдържание.

ИЗВАДЯЩО СЪДЪРЖАНИЕ НА ЕТИКЕТИТЕ

През цялото време говорим за намиране на правилните тагове. Време е да извлечем съдържанието на маркера, когато го намерим.

Това е доста просто. Всичко, което трябва да направим, е да добавим “/ text ()” към синтаксиса и съдържанието на маркера ще бъде извлечено.

В [14]: отговор.xpath ('/ html // a / text ()').екстракт()

Кодът по-горе ще получи всички закотвени маркери в html документа и след това ще извлече текстовото съдържание.

ИЗВЪРКВАНЕ НА ВРЪЗКИТЕ

Сега, когато знаем как да извлечем текста в тагове, трябва да знаем как да извлечем стойностите на атрибутите. В повечето случаи стойностите на атрибутите, които са от най-голямо значение за нас, са връзки.

Правенето на това е почти същото като извличането на текстовите стойности, но вместо да използваме „/ text ()“, ще използваме символа „/ @“ и името на атрибута.

В [15]: отговор.xpath ('/ html // a / @ href').екстракт()

Кодът по-горе ще извлече всички връзки в котвата тагове, връзките трябва да бъдат стойностите на href атрибут.

НАВИГАЦИЯ НА ТРАНСПОРТНИ ЕТИКЕТИ

Ако сте забелязали, през цялото време сме се придвижвали по тагове. Има обаче една ситуация, с която не сме се справили.

Как да изберем определен маркер, когато маркерите с едно и също име са на едно и също ниво?




Афганистан




Аландски острови


В случай като този, който имаме по-горе, ако трябва да го разгледаме, може да кажем, че ще използваме извличане_първо () за да получите първия мач.

Какво обаче, ако искаме да съответстваме на втория? Ами ако има повече от десет опции и ние искаме петата? Ще отговорим на това точно сега.

Ето решението: Когато напишем синтаксиса на Xpath, поставяме позицията на маркера, който искаме, в квадратни скоби, точно както индексираме, но индексът започва от 1.

Разглеждайки html на уеб страницата, с която имаме работа, ще забележите, че има много тагове на едно и също ниво. За да получите третия таг, бихме използвали следния код:

В [16]: отговор.xpath ('/ html // tr [3]').екстракт()

Също така ще забележите, че таговете са в две, ако искаме само втората тагове от редове бихме направили следното:

В [17]: отговор.xpath ('/ html // td [2]').екстракт()

ЗАКЛЮЧЕНИЕ:

Xpath е много мощен начин за синтактичен анализ на html файлове и може да помогне да се сведе до минимум използването на регулярни изрази при тяхното анализиране, като се има предвид, че има съдържа функция в своя синтаксис.

Има и други библиотеки, които позволяват синтактичен анализ на Xpath като Selenium за уеб автоматизация. Xpath ни дава много опции при анализиране на html, но това, което е разгледано в тази статия, трябва да може да ви преведе през обичайните операции за синтактичен анализ на html.

Безплатни и игри с отворен код за разработване на Linux игри
Тази статия ще обхване списък с безплатни двигатели за игри с отворен код, които могат да се използват за разработване на 2D и 3D игри на Linux. Същес...
Урок Сянка на Tomb Raider за Linux
Shadow of the Tomb Raider е дванадесетото допълнение към поредицата Tomb Raider - франчайз за екшън-приключенска игра, създаден от Eidos Montreal. Игр...
Как да увеличите FPS в Linux?
FPS означава Кадри в секунда. Задачата на FPS е да измерва честотата на кадрите при възпроизвеждане на видео или игрални изпълнения. С прости думи бро...