Не могу понять, как использовать Html Agility Pack для чтения определенной части веб-страницы - PullRequest
3 голосов
/ 28 января 2012

Я пытаюсь прочитать определенную часть веб-сайта (www.joindota.com), которая имеет одинаковые значения во всем.Я объясню, что я хочу сделать с примерами с сайта:

Следующий HTML-код является частью того, что я хочу прочитать с сайта:

<div id="matchticker_coverage_content_1761" style="display:none;">
    <a href="http://www.joindota.com/en/matches/16102-team-dignitas-dota-vs-sk-gaming-dota" class="item">
        <div class="sub" style="width: 18px; text-align: left;"><img src="http://www.gs-media.de/img/themes/joindota/ticker_9.png" border="0" alt="" /></div>
        <div class="sub" style="width: 103px;"><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 class="sub" style="float: right; text-align: right;">
            <span title="Sun, 29.01.2012, 16:00 CET">tomorrow</span>
        </div>
        <div class="cl"></div>
    </a>
    <a href="http://www.joindota.com/en/matches/16101-world-elite-vs-mineski" class="item">
        <div class="sub" style="width: 18px; text-align: left;"><img src="http://www.gs-media.de/img/themes/joindota/ticker_9.png" border="0" alt="" /></div>
        <div class="sub" style="width: 103px;"><img src="http://www.gs-media.de/img/flags/cn.gif" border="0" alt="cn" title="China" /> WE</div>
        <div class="sub" style="width: 20px;">vs.</div>
        <div class="sub" style="width: 103px;"><img src="http://www.gs-media.de/img/flags/ph.gif" border="0" alt="ph" title="Philippines" /> Mski</div>
        <div class="sub" style="float: right; text-align: right;">
            <span title="Sun, 29.01.2012, 14:00 CET">tomorrow</span>
        </div>
        <div class="cl"></div>
    </a>
    ....
</div>

Я хочу прочитатьвсе от <div id="matchticker_coverage_content_1761" >

Мне просто нужно прочитать все значения в тегах <div>, которые я там предоставил.Например, он вывел бы:

  • Дигни против SK
  • WS против Mski
  • EG против Fnatic
  • и т. Д.

Все значения div в этом HTML одинаковы, мне просто нужно знать, как "выбрать" <div id="matchticker_coverage_content_1761" > конкретно на странице, и прочитать все остальные div в этом div, который является простоиз них:

<div class="sub" style="width: 103px;"><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> одинаковы, все, что меня интересует, - это текст внутри них, такой как Digni, vs. и SK, например.

Мне просто нужно прочитать все эти значения в <div id="matchticker_coverage_content_1761" > </div>

Причина в том, что на сайте их много, а мне нужно только прочитать определенную часть.Вот другая часть на той же странице, которая идентична, отличается только div, в котором находятся все остальные div.

Пример:

<div id="matchticker_coverage_content_1596" style="display:none;">
    <a href="http://www.joindota.com/en/matches/16564-westernwolves-vs-panzer" class="item">
        <div class="sub" style="width: 18px; text-align: left;"><img src="http://www.gs-media.de/img/themes/joindota/ticker_9.png" border="0" alt="" /></div>
        <div class="sub" style="width: 103px;"><img src="http://www.gs-media.de/img/flags/fr.gif" border="0" alt="fr" title="France" /> Wolves</div>
        <div class="sub" style="width: 20px;">vs.</div>
        <div class="sub" style="width: 103px;"><img src="http://www.gs-media.de/img/flags/de.gif" border="0" alt="de" title="Germany" /> PANZER</div>
        <div class="sub" style="float: right; text-align: right;">
            <span title="Tue, 31.01.2012, 21:00 CET">31.01.</span>
        </div>
        <div class="cl"></div>
    </a>
    <a href="http://www.joindota.com/en/matches/16626-panzer-vs-just-4-the-tournament" class="item">
        <div class="sub" style="width: 18px; text-align: left;"><img src="http://www.gs-media.de/img/themes/joindota/ticker_9.png" border="0" alt="" /></div>
        <div class="sub" style="width: 103px;"><img src="http://www.gs-media.de/img/flags/de.gif" border="0" alt="de" title="Germany" /> PANZER</div>
        <div class="sub" style="width: 20px;">vs.</div>
        <div class="sub" style="width: 103px;"><img src="http://www.gs-media.de/img/flags/de.gif" border="0" alt="de" title="Germany" /> J4T</div>
        <div class="sub" style="float: right; text-align: right;">
            <span title="Sun, 29.01.2012, 19:00 CET">tomorrow</span>
        </div>
        <div class="cl"></div>
    </a>
    ....
</div>

Обратите внимание, как все <div>точно так же в начале <div>?что <div> где все <div> находятся <div id="matchticker_coverage_content_1596" style="display:none;">, что отличается от другой части страницы, где оно <div id="matchticker_coverage_content_1761" style="display:none;">

Мой окончательный вопрос: как мне выбрать это начало <div> который содержит другой <div>, и прочитайте те конкретные, которые я упоминал ранее?

1 Ответ

6 голосов
/ 29 января 2012

Сканирование / паутинка в Интернете, будь то семантический 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>, который содержит «против».введите текст, а затем посмотрите на братьев и сестер, один из них - первый игрок, а второй - второй игрок.

Обратите внимание, последний шаг - очень хрупкий , и он будет всегда хрупким, поскольку в тегах нет семантических индикаторов. Вы по существу зависите от подробностей реализации (потому что у вас нет другого выбора).

Я Настоятельно рекомендую, чтобы у вас были тестовые случаи на определенных страницах, где вы анализируете контент и проверяете данные; таким образом, если структура страницы изменится, вы сразу узнаете об этом и сможете соответствующим образом изменить логику очистки.

...