R-Advanced Web Scraping - обход aspNetHidden с использованием xmlTreeParse ()

0

Этот вопрос занимает немного времени, чтобы представить, нести меня. Будет весело решать, если вы можете туда добраться. Этот фрагмент будет реплицирован на тысячи страниц на этом веб-сайте, используя цикл.

Я пытаюсь очистить веб-сайт http://www.digikey.com/product-detail/en/207314-1/A25077-ND/, чтобы посмотреть данные в таблице с помощью Digi-Key Part Number, Quantity Available и т.д... включая правую сторону с ценовым разрывом, Цена за штуку, Расширенная цена.

Использование функции R readHTMLTable() не работает и возвращает только значения NULL. Причина этого (я считаю) заключается в том, что веб-сайт скрыл ее содержимое, используя тег "aspNetHidden" в html-коде.

По этой причине я также обнаружил трудности с использованием htmlTreeParse() и xmlTreeParse() со всем сектором, родительским, не появляющимся в результатах.

Использование функции sc scrape() из пакета scrapeR

require(scrapeR)

URL<-scrape("http://www.digikey.com/product-detail/en/207314-1/A25077-ND/")

возвращает полный html-код, включая интересующие строки:

<th align="right">Digi-Key Part Number</th>
<td id="reportpartnumber">
<meta itemprop="productID" content="sku:A25077-ND">A25077-ND</td>

<th>Price Break</th>
<th>Unit Price</th>
<th>Extended Price
</th>
</tr>
<tr>
<td align="center">1</td>
<td align="right">2.75000</td>
<td align="right">2.75</td>

Тем не менее, я не смог выбрать узлы из этого блока кода с возвращаемой ошибкой:

no applicable method for 'xpathApply' applied to an object of class "list"

Я получил эту ошибку, используя различные функции, такие как:

xpathSApply(URL,'//*[@id="pricing"]/tbody/tr[2]')

getNodeSet(URL,"//html[@class='rd-product-details-page']")

Я не самый знакомый с xpath, но идентифицировал xpath, используя элемент проверки на веб-странице, и скопировал xpath.

Любая помощь, которую вы можете оказать на это, будет очень признательна!

  • 0
    Из какой упаковки scrape ?
  • 1
    Я догадываюсь ее от ScrapeR
Показать ещё 1 комментарий
Теги:
xpath
web-scraping
scrape

1 ответ

2
Лучший ответ

Вы не читали справку о том, что у вас есть? Он возвращает список, вам нужно получить части этого списка (если parse = TRUE) и так далее.

Также я думаю, что на веб-странице происходит тяжелое обнаружение браузера. Если я попробую и wget страницу из командной строки, я получаю страницу с ошибкой, функция scrape получает что-то полезное (но похоже на вас), и Chrome получает полный мусор со всеми закодированными материалами. Тьфу. Вот что для меня работает:

> URL<-scrape("http://www.digikey.com/product-detail/en/207314-1/A25077-ND/")
> tables = xpathSApply(URL[[1]],'//table')
> tables[[2]]
<table class="product-details" border="1" cellspacing="1" cellpadding="2">
  <tr class="product-details-top"/>
  <tr class="product-details-bottom">
    <td class="pricing-description" colspan="3" align="right">All prices are in US dollars.</td>
  </tr>
  <tr>
    <th align="right">Digi-Key Part Number</th>
    <td id="reportpartnumber"><meta itemprop="productID" content="sku:A25077-ND"/>A25077-ND</td>
    <td class="catalog-pricing" rowspan="6" align="center" valign="top">
      <table id="pricing" frame="void" rules="all" border="1" cellspacing="0" cellpadding="1">
        <tr>
          <th>Price Break</th>
          <th>Unit Price</th>
          <th>Extended Price&#13;
</th>
        </tr>
        <tr>
          <td align="center">1</td>
          <td align="right">2.75000</td>
          <td align="right">2.75</td>

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

pricing = xpathSApply(URL[[1]],'//table[@id="pricing"]')[[1]]

> pricing
<table id="pricing" frame="void" rules="all" border="1" cellspacing="0" cellpadding="1">
  <tr>
    <th>Price Break</th>
    <th>Unit Price</th>
    <th>Extended Price&#13;
</th>
  </tr>
  <tr>
    <td align="center">1</td>
    <td align="right">2.75000</td>
    <td align="right">2.75</td>
  </tr>

и так далее.

  • 0
    Отличный ответ, и спасибо за быстрый ответ. Как лучше всего перевести таблицу цен в фрейм данных?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню