Можете ли вы привести примеры парсинга HTML? - PullRequest
69 голосов
/ 21 апреля 2009

Как вы анализируете HTML с различными языками и библиотеками разбора?


При ответе:

Отдельные комментарии будут связаны с ответами на вопросы о том, как анализировать HTML с регулярными выражениями, чтобы показать правильный способ выполнения действий.

Ради согласованности я прошу, чтобы в примере был проанализирован HTML-файл для href в тегах привязки. Чтобы облегчить поиск по этому вопросу, я прошу вас придерживаться этого формата

Язык: [название языка]

Библиотека: [имя библиотеки]

[example code]

Пожалуйста, сделайте библиотеку ссылкой на документацию для библиотеки. Если вы хотите предоставить пример, отличный от извлечения ссылок, пожалуйста, укажите также:

Цель: [что делает анализ]

Ответы [ 29 ]

3 голосов
/ 21 апреля 2009

язык: Python
библиотека: lxml.html

import lxml.html

html = "<html><body>"
for link in ("foo", "bar", "baz"):
    html += '<a href="http://%s.com">%s</a>' % (link, link)
html += "</body></html>"

tree = lxml.html.document_fromstring(html)
for element, attribute, link, pos in tree.iterlinks():
    if attribute == "href":
        print link

В lxml также есть класс селектора CSS для обхода DOM, что делает его использование очень похожим на использование JQuery:

for a in tree.cssselect('a[href]'):
    print a.get('href')
3 голосов
/ 22 апреля 2009

Язык: Objective-C
Библиотека: libxml2 + Обертки libxml2 Мэтта Галлахера + ASIHTTPRequest Бена Копси

ASIHTTPRequest *request = [ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://stackoverflow.com/questions/773340"];
[request start];
NSError *error = [request error];
if (!error) {
    NSData *response = [request responseData];
    NSLog(@"Data: %@", [[self query:@"//a[@href]" withResponse:response] description]);
    [request release];
}
else 
    @throw [NSException exceptionWithName:@"kMyHTTPRequestFailed" reason:@"Request failed!" userInfo:nil];

...

- (id) query:(NSString *)xpathQuery WithResponse:(NSData *)resp {
    NSArray *nodes = PerformHTMLXPathQuery(resp, xpathQuery);
    if (nodes != nil)
        return nodes;
    return nil;
}
1 голос
/ 07 января 2012

язык: Ruby
библиотека: Нокогири

#!/usr/bin/env ruby

require "nokogiri"
require "open-uri"

doc = Nokogiri::HTML(open('http://www.example.com'))
hrefs = doc.search('a').map{ |n| n['href'] }

puts hrefs

Какие выходы:

/
/domains/
/numbers/
/protocols/
/about/
/go/rfc2606
/about/
/about/presentations/
/about/performance/
/reports/
/domains/
/domains/root/
/domains/int/
/domains/arpa/
/domains/idn-tables/
/protocols/
/numbers/
/abuse/
http://www.icann.org/
mailto:iana@iana.org?subject=General%20website%20feedback

Это незначительное вращение на приведенном выше, приводящее к выводу, который можно использовать для отчета. Я возвращаю только первый и последний элементы в списке hrefs:

#!/usr/bin/env ruby

require "nokogiri"
require "open-uri"

doc = Nokogiri::HTML(open('http://nokogiri.org'))
hrefs = doc.search('a[href]').map{ |n| n['href'] }

puts hrefs
  .each_with_index                     # add an array index
  .minmax{ |a,b| a.last <=> b.last }   # find the first and last element
  .map{ |h,i| '%3d %s' % [1 + i, h ] } # format the output

  1 http://github.com/tenderlove/nokogiri
100 http://yokolet.blogspot.com
1 голос
/ 03 августа 2011

Язык: Java
Библиотека: jsoup

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.xml.sax.SAXException;

public class HtmlTest {
    public static void main(final String[] args) throws SAXException, ValidityException, ParsingException, IOException {
        final Document document = Jsoup.parse("<html><body><ul><li><a href=\"http://google.com\">google</li><li><a HREF=\"http://reddit.org\" target=\"_blank\">reddit</a></li><li><a name=\"nothing\">nothing</a><li></ul></body></html>");
        final Elements links = document.select("a[href]");
        for (final Element element : links) {
            System.out.println(element.attr("href"));
        }
    }
}
1 голос
/ 25 марта 2011

Язык: Python
Библиотека: HTQL

import htql; 

page="<a href=a.html>1</a><a href=b.html>2</a><a href=c.html>3</a>";
query="<a>:href,tx";

for url, text in htql.HTQL(page, query): 
    print url, text;

Простой и интуитивно понятный.

0 голосов
/ 25 января 2016

Язык: JavaScript / Node.js

Библиотека: Запрос и Cheerio

var request = require('request');
var cheerio = require('cheerio');

var url = "https://news.ycombinator.com/";
request(url, function (error, response, html) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        var anchorTags = $('a');

        anchorTags.each(function(i,element){
            console.log(element["attribs"]["href"]);
        });
    }
});

Библиотека запросов загружает html-документ, а Cheerio позволяет использовать селекторы jquery css для нацеливания html-документа.

0 голосов
/ 09 января 2014

Язык: Coldfusion 9.0.1 +

Библиотека: jSoup

<cfscript>
function parseURL(required string url){
var res = [];
var javaLoader = createObject("javaloader.JavaLoader").init([expandPath("./jsoup-1.7.3.jar")]);
var jSoupClass = javaLoader.create("org.jsoup.Jsoup");
//var dom = jSoupClass.parse(html); // if you already have some html to parse.
var dom = jSoupClass.connect( arguments.url ).get();
var links = dom.select("a");
for(var a=1;a LT arrayLen(links);a++){
    var s={};s.href= links[a].attr('href'); s.text= links[a].text(); 
    if(s.href contains "http://" || s.href contains "https://") arrayAppend(res,s); 
}
return res; 
}   

//writeoutput(writedump(parseURL(url)));
</cfscript>
<cfdump var="#parseURL("/425063/mozhete-li-vy-privesti-primery-parsinga-html")#">

Возвращает массив структур, каждая структура содержит объекты HREF и TEXT.

0 голосов
/ 22 марта 2012

Используя phantomjs, сохраните этот файл как extract-links.js:

var page = new WebPage(),
    url = 'http://www.udacity.com';

page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        var results = page.evaluate(function() {
            var list = document.querySelectorAll('a'), links = [], i;
            for (i = 0; i < list.length; i++) {
                links.push(list[i].href);
            }
            return links;
        });
        console.log(results.join('\n'));
    }
    phantom.exit();
});

пробег:

$ ../path/to/bin/phantomjs extract-links.js
0 голосов
/ 28 октября 2010

Язык: PHP Библиотека: DOM

<?php
$doc = new DOMDocument();
$doc->strictErrorChecking = false;
$doc->loadHTMLFile('http://stackoverflow.com/questions/773340');
$xpath = new DOMXpath($doc);

$links = $xpath->query('//a[@href]');
for ($i = 0; $i < $links->length; $i++)
    echo $links->item($i)->getAttribute('href'), "\n";

Иногда полезно поставить символ @ перед $doc->loadHTMLFile для подавления недопустимых предупреждений о разборе html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...