Próbuję wymyślić algorytm, który identyfikuje, czy ciąg jest częścią zawartości tekstowej elementu, czy też jest częścią atrybutów elementu.
Na przykład:
<a class="tag tag-red-dark" href="/keywords?q=PARTOFATTRIBUTE"> Found TEXTCONTENT </a>
Jeśli wykonasz wyrażenie regularne na TEXTCONTENT
lub PARTOFATTRIBUTE
, możesz uruchomić ten algorytm, aby sprawdzić, czy są one częścią tekstu, czy częścią atrybutów:
MatchCollection matches = Regex.Matches(html, @"(?i)TEXTCONTENT");
for (int i = matches.Count-1; i >= 0 ; i--){
Match m = matches[i];
int currentIndex = m.Index;
bool isTextContent = false;
while (html[currentIndex] != '<'){
currentIndex--;
if (html[currentIndex] == '>'){ // text is placed between > and <
isTextContent = true;
break;
}
}
if (isTextContent){
// do something with text content
}else{
// do something with attribute
}
}
Ale algorytm jest kruchy. Jeśli Twój html wygląda tak:
<a class="tag tag-red-dark" title="a>b" href="/keywords?q=PARTOFATTRIBUTE"> Found TEXTCONTENT </a>
PARTOFATTRIBUTE zostanie rozpoznany jako tekst, a nie.
Co więcej, możesz również mieć tekst zawierający <, co sprawia, że algorytm pomyśli, że znalazł atrybut:
<a class="tag tag-red-dark" title="a>b" href="/keywords?q=PARTOFATTRIBUTE"> < Found TEXTCONTENT </a>
Umieszczenie
1 odpowiedź
HtmlAgilityPack nie jest wolny, nie musisz analizować całej strony tylko tagu A. Ponieważ prawdopodobnie już przeanalizowałeś tagi a w swoim html. Po prostu podaj tylko ten kod HTML, który potrzebujesz przeanalizować.
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml("<a class=\"tag tag - red - dark\" title=\"a > b\" href=\" / keywords ? q = PARTOFATTRIBUTE\"> < Found TEXTCONTENT </a>");
if (htmlDoc.DocumentNode.ChildNodes[0].InnerHtml.Contains("TEXTCONTENT"))
{
// do something with text content
}
if (htmlDoc.DocumentNode.ChildNodes[0].Attributes["href"].Value.Contains("PARTOFATTRIBUTE"))
{
// do something with attribute
}
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.
HtmlAgilityPack
lub innej biblioteki innej firmy, która analizuje HTML, a następnie sprawdza wszystkie elementy za pomocą niestandardowej logiki walidacji