Raspagem de tela: expressões regulares ou expressões XQuery?

Eu estava respondendo a algumas perguntas do questionário para uma entrevista, e a pergunta era sobre como eu faria a raspagem de tela. Ou seja, escolhendo o conteúdo de uma página da web, supondo que você não tenha uma maneira melhor estruturada de consultar as informações diretamente (por exemplo, um serviço da web).

minha solução foi usar um XQuery expressão. A expressão era bastante longa, porque o conteúdo que eu precisava era bastante profundo na hierarquia HTML. Eu tive que procurar pelos ancestrais de maneira justa antes de encontrar um elemento com umid attribute. Por exemplo, raspar uma página da Amazon.com para Dimensões do produto é assim:

//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()

Essa é uma expressão bastante desagradável, mas é por isso que a Amazon fornece uma API de serviço da web. Enfim, é apenas um exemplo. A questão não era sobre a Amazon, mas sobre raspagem de tel

O entrevistador não gostou da minha solução. Ele achou que era frágil, porque uma alteração no design da página pela Amazon poderia exigir a reescrita da expressão XQuery. É difícil depurar uma expressão XQuery que não corresponde a nada na página em que ela é aplicada.

Não discordo de suas declarações, mas não achei que sua solução fosse uma melhoria: ele achou melhor usar umexpressão regula e pesquise conteúdo e marcação próximo ao peso da remessa. Por exemplo, usando Perl:

$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;

Meu contra-argumento foi que isso também é suscetível à Amazon alterar seu código HTML. Eles poderiam soletrar tags HTML em maiúsculas <LI>) ou adicione atributos CSS ou altere<b> para<span> ou mude o rótulo "Dimensões do produto:" para "Dimensões:" ou muitos outros tipos de alterações. Meu argumento era que expressões regulares não resolvem os pontos fracos que ele destacou na minha solução XQuer

Mas, além disso, expressões regulares podem encontrar falsos positivos, a menos que você adicione contexto suficiente à expressão. Também pode corresponder, sem querer, a conteúdo que esteja dentro de um comentário, uma sequência de atributos ou uma seção CDAT

Minha pergunta é: qual tecnologia você usa para fazer a raspagem de tela? Por que você escolheu essa solução? Existe algum motivo convincente para usar um? Ou nunca usar o outro? Existe uma terceira opção além das que mostrei acima?

PS: suponha, por uma questão de argumento, que não há API de serviço da web ou outra maneira mais direta de adquirir o conteúdo desejad

questionAnswers(8)

yourAnswerToTheQuestion