Эквивалент Grep и Sed для обработки командной строки XML

Вы можете использовать селектор атрибута = значение для нацеливания на href. В этом случае я использую подстроку в конце с помощью оператора содержимого (*).

WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[href*=ctl08]'))).click()

Я добавляю в ожидании кликабельного состояния в качестве меры предосторожности. Вы могли бы, вероятно, удалить это.

Дополнительный импорт

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

Без условия ожидания:

browser.find_element_by_css_selector('[href*=ctl08]'),click()

Другой способ:

Теперь вместо этого вы может изначально установить счетчик результатов страницы равным 100 (максимум), а затем перебрать выпадающий список страниц результатов для загрузки каждой новой страницы (тогда вам не нужно работать над количеством страниц)

import requests, re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
url ='http://jobquest.detma.org/JobQuest/Training.aspx'
browser.get(url)
submit_button = browser.find_element_by_id('ctl00_ctl00_bodyMainBase_bodyMain_btnSubmit')
submit_button.click()
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[value="100"]'))).click()
html = browser.page_source
soup = BeautifulSoup(html, "html.parser")
rows = soup.find_all("tr",{"class":"gvRow"})
id_list=[]

for row in rows:
    temp = str(row.find("a"))[33:40]
    id_list.append(temp)

elems = browser.find_elements_by_css_selector('#ctl00_ctl00_bodyMainBase_bodyMain_egvResults select option')
i = 1
while i < len(elems) / 2:
    browser.find_element_by_css_selector('#ctl00_ctl00_bodyMainBase_bodyMain_egvResults select option[value="' + str(i) + '"]').click()
    #do stuff with new page
    i+=1

[ 1113] Вы сами решаете, что делать с извлечением информации о строках с каждой страницы. Это должно было дать вам простую структуру для зацикливания всех страниц.

145
задан 01.10.2019, 19:06

6 ответов

Я нашел, что xmlstarlet довольно хорош в этом виде вещи.

http://xmlstar.sourceforge.net/

Должен быть доступным в большинстве репозиториев дистрибутива, также. Вводное учебное руководство здесь:

http://www.ibm.com/developerworks/library/x-starlet.html

102
ответ дан 01.10.2019, 19:13
  • 1
    Doesn' t поддерживают XQuery, хотя, насколько я могу сказать. – Steve Bennett 01.10.2019, 19:13
  • 2
    @SteveBennett действительно это doesn' t, но функции это добавляет сверху необработанного XPath, достаточно хороши для создания его конкурентоспособным по отношению к " grep и sed". если Вы хотите необычное, необычное совершенство XQuery... хорошо, that' s больше как эквивалент XML жемчугу или awk.:) – Charles Duffy 01.10.2019, 19:14
  • 3
    @HendyIrawan видят здесь: xmlstar.sourceforge.net/doc/UG/ch05s01.html – Phil 01.10.2019, 19:14
  • 4
    Мысль I' d указывают, что существуют двоичные файлы Windows, доступные на сайте SourceForge. – Steve Bennett 01.10.2019, 19:15
  • 5
    Хм. Странный. download.oracle.com/otn-pub/jcp/… списки эта функция, поскольку Вы описали его. Openjpa 2.1.1 должен быть JPA 2.0. – Udo Held 14.12.2019, 13:01

JEdit имеет плагин под названием "XQuery", который обеспечивает запросы функциональности для XML-документов.

Не совсем командная строка, но это работает!

-1
ответ дан 01.10.2019, 19:07
  • 1
    Форматирование. Действительно добавьте https и двоеточия и наклонные черты перед github.com – Martin Paljak 05.12.2019, 03:43

XQuery мог бы быть хорошим решением. Это (относительно) легко изучить и является стандартом W3C.

я рекомендовал бы XQSharp для процессора командной строки.

2
ответ дан 01.10.2019, 19:09
  • 1
    BaseX также имеет процессор XQuery командной строки (в дополнение к его режиму базы данных) и остается в курсе с новейшими версиями стандарта (после развивающегося проекта XQuery 3.0 вполне тесно). – Charles Duffy 01.10.2019, 19:09
  • 2
    " победите устанавливают git+github.com/martinpaljak/M2Crypto.git" сбои с " ValueError: (' Ожидаемая спецификация версии in' ' git+github.com/martinpaljak/M2Crypto.git' ' at' ' +github.com/martinpaljak/M2Crypto.git') " в моей системе Ubuntu 10.04. – Paul Whipp 05.12.2019, 03:43

Зависит от точно, что Вы хотите сделать.

XSLT может быть способом пойти, но существует кривая обучения. Попробуйте xsltproc и обратите внимание, что можно вручить параметры.

5
ответ дан 01.10.2019, 19:10
  • 1
    И I' ve теперь также обновил официальную документацию HTML - должен скоро собраться для 3,2 и 3.3, и через несколько дней для 2,7. – Vinay Sajip 21.11.2019, 17:16

Некоторые многообещающие инструменты:

  • nokogiri: парсинг DOMS HTML/XML в рубине с помощью XPath & селекторы CSS

  • hpricot: удержанный от использования

  • fxgrep: Использует его собственный подобный XPath синтаксис для запросов документов. Записанный в SML, таким образом, установка может быть трудной.

  • LT XML: инструментарий XML получен из инструментов SGML, включая sggrep, sgsort, xmlnorm и другие. Использует его собственный синтаксис запроса. Документация очень формальна. Записанный в C. LT XML 2 требует поддержки XPath, XInclude и других стандартов W3C.

  • xmlgrep2: простой и мощный поиск с XPath. Записанный в Perl с помощью XML:: LibXML и libxml2.

  • XQSharp: Поддержки XQuery, расширение XPath. Записанный для Платформы.NET.

  • xml-coreutils: инструментарий Laird Breyer, эквивалентный GNU coreutils. Обсужденный в интересном эссе на том, что должен включать идеальный инструментарий.

  • xmldiff: Простой инструмент для сравнения двух xml файлов.

  • xmltk: кажется, не имеет пакет в debian, человечности, мягкой фетровой шляпе, или macports, не имел выпуска с 2007 и использует непортативную автоматизацию сборки.

xml-coreutils кажется лучшим, зарегистрированным и наиболее ориентированным на UNIX.

35
ответ дан 01.10.2019, 19:13
  • 1
    Couldn' t Вы создают сценарий обертки для программы Ruby и передачу в arguments' массив в сценарии к hpricot? Например, в сценарии оболочки PHP что-то как следующее должно работать: <? php/path/to/hpricot $argv? > – alastairs 01.10.2019, 19:13
  • 2
    Проверенный это. Я получаю исключение с openjpa. Ссылка я связался ( docs.oracle.com/cd/E16764_01/apirefs.1111/e13946/… ), показывает только два аргумента также. – Udo Held 14.12.2019, 13:01

К превосходному списку Joseph Holsten я добавляю xpath сценарий командной строки, который идет с библиотекой Perl XML:: XPath. Отличный способ извлечь информацию из XML-файлов:

 xpath -q -e '/entry[@xml:lang="fr"]' *xml
24
ответ дан 01.10.2019, 19:14
  • 1
    Это установлено по умолчанию в osx, но без -q -e опции. Пример, получите атрибут " package" значение от " manifest" узел в " AndroidManifest.xml": xpath AndroidManifest.xml 'string(/manifest/@package)' 2> /dev/null – antonj 01.10.2019, 19:14

Теги

Похожие вопросы