Сканирование / паутинка в Интернете, будь то семантический HTML или нет, для конкретных точек данных (в отличие от общего поиска по релевантности, такого как Google), - больше искусство, чем наука.
Вам чаще всего приходится настраивать свой сканер специально для каждого сайта, который вы хотите сканировать, чтобы получить данные, которые вы хотите получить одинаковых точек данных откаждый сайт, но каждый сайт представляет их по-разному .
Имея это в виду, обычно это упражнение в определении шаблонов, которое позволит вам последовательно идентифицировать точки данных в пределах определенного сайта.
Я взял на себя смелость вырубить ваши образцы HTML, а также отформатировать его , чтобы показать иерархию тегов;это не повлияет на то, как страница будет анализироваться или отображаться, поскольку речь идет о том, что в тегах, а не вне их.
При такой перестановке должны появиться шаблоны.
Давайте сначала определим элементы контейнера <div>
.То, что уникально идентифицирует эти <div>
элементы, является атрибутом id
, все они имеют форму:
<div id="matchticker_coverage_content_**some number**" style="display:none;">
(Примечание: вы могли бы искать любой <div>
элемент с атрибутом style="display:none;"
, но он очень хрупкий и не является уникальным идентификатором контейнера, этот атрибут может быть применен в любом месте else и имеет no семантическуюзначение)
К сожалению, атрибут id
является проблемой, потому что кажется, что его конец - это число, которое является каким-то идентификатором и не согласованным на всех страницах.Если бы вы знали идентификатор контейнера, вы могли бы просто использовать следующее выражение с Html Agility Pack:
\\div[id='matchticker_coverage_content_1596']
Но я полагаю, что вы не его знаете.
То, что вы действительно хотите, - это возможность искать все <div>
элементы, где атрибут id
начинается с matchticker_coverage_content_
.
Html AgilityПакет не поддерживает этот тип синтаксиса селектора.Однако jQuery делает со следующим синтаксисом:
div[id^='matchticker_coverage_content_']
Еще лучше то, что проект fizzler делает поддерживает этот селектор .Поэтому в этом случае я бы использовал fizzler для получения этого контейнера.
После того, как у вас есть контейнер, нужно посмотреть его дочерние элементы.Опять же, после редактирования должно быть очевидно, что каждый искомый матчап (с соответствующими <div>
элементами) содержит внутри якорного (т.е. <a>
) элемента.Поэтому, когда у вас есть контейнер <div>
, вы можете просто выбрать все дочерние элементы, которые являются элементами привязки, со следующим синтаксисом:
/a
(или просто селектор a
на узле контейнераесли вы используете fizzler)
Если у вас есть это, вам не нужно обнаруживать «против», вы можете предположить, что оно есть, вы действительно хотите обнаружить игроков .
Это сложнее, потому что нет ничего семантического в тегах, классах или идентификаторах.Тем не менее, есть дискриминатор.Глядя на теги игроков (некоторые из них я сократил, чтобы сделать их более понятными):
<div class="sub">
<img src="http://www.gs-media.de/img/themes/joindota/ticker_9.png"
border="0" alt="" /></div>
<div class="sub">
<img src="http://www.gs-media.de/img/flags/ro.gif"
border="0" alt="ro" title="Romania" /> Digni</div>
<div class="sub" style="width: 20px;">vs.</div>
<div class="sub" style="width: 103px;">
<img src="http://www.gs-media.de/img/flags/dk.gif"
border="0" alt="dk" title="Denmark" /> SK</div>
Вы можете видеть, что игроки находятся в тегах <div>
, которые имеют дочерний тег <img>
где атрибут alt
не пустой (это важно, так как вы не хотите обрабатывать первый <div>
элемент).
Как только вы определите эти теги <img>
, вы можете просто получить родительский узел (<div>
) и взять текст из узла, чтобы получить вашего игрока.Первый - это первая сторона игрока, а вторая, которую вы обрабатываете, - вторая сторона игрока.
Альтернативный подход заключается в определении элемента <div>
, который содержит «против».введите текст, а затем посмотрите на братьев и сестер, один из них - первый игрок, а второй - второй игрок.
Обратите внимание, последний шаг - очень хрупкий , и он будет всегда хрупким, поскольку в тегах нет семантических индикаторов. Вы по существу зависите от подробностей реализации (потому что у вас нет другого выбора).
Я Настоятельно рекомендую, чтобы у вас были тестовые случаи на определенных страницах, где вы анализируете контент и проверяете данные; таким образом, если структура страницы изменится, вы сразу узнаете об этом и сможете соответствующим образом изменить логику очистки.