Как Вы анализируете строку HTML для тегов изображения для достигания информации SRC?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
25
задан Community 23 May 2017 в 12:17
поделиться

4 ответа

Если Ваша входная строка является допустимым XHTML, можно рассматривать, как xml, загрузите его в xmldocument и сделайте волшебство XPath:), Но это не всегда имеет место.

Иначе можно попробовать эту функцию, которая возвратит все ссылки изображения из HtmlSource:

public List<Uri> FetchLinksFromSource(string htmlSource)
{
    List<Uri> links = new List<Uri>();
    string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
    MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    foreach (Match m in matchesImgSrc)
    {
        string href = m.Groups[1].Value;
        links.Add(new Uri(href));
    }
    return links;
}

И можно использовать его как это:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
    using(StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        List<Uri> links = FetchLinksFromSource(sr.ReadToEnd());
    }
}
53
ответ дан Community 28 November 2019 в 18:18
поделиться

Большой проблемой с любым парсингом HTML является "хорошо сформированная" часть. Вы видели загаженный HTML там - сколько из него действительно хорошо формируется? Я должен был сделать что-то подобное - синтаксический анализ, все ссылки в документе (и в моем случае) обновляют их с переписанной ссылкой. Я нашел Пакет Гибкости HTML на CodePlex. Это качает (и обрабатывает уродливый HTML).

Вот отрывок для итерации по ссылкам в документе:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"C:\Sample.HTM");
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a/@href");

Content match = null;

// Run only if there are links in the document.
if (linkNodes != null)
{
    foreach (HtmlNode linkNode in linkNodes)
    {
        HtmlAttribute attrib = linkNode.Attributes["href"];
        // Do whatever else you need here
    }
}

Исходное Сообщение в блоге

11
ответ дан Paul Mrozowski 28 November 2019 в 18:18
поделиться

Если бы все, в чем Вы нуждаетесь, является изображениями, я просто использовал бы регулярное выражение. Что-то вроде этого должно добиться цели:

Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
4
ответ дан rslite 28 November 2019 в 18:18
поделиться

Если это - допустимый xhtml, Вы могли бы сделать это:

XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
-3
ответ дан Khoth 28 November 2019 в 18:18
поделиться
Другие вопросы по тегам:

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