#xpath #web-scraping #google-sheets #google-sheets-query #google-sheets-importxml
#xpath #очистка веб-страниц #google-sheets #google-sheets-запрос #google-таблицы-формула
Вопрос:
Я пытаюсь использовать Xpath для захвата строк таблицы, содержащей изображения и текст. Все работает нормально, пока присутствуют изображения, как в этой третьей таблице на этой странице. Но когда изображения отсутствуют, как в таблице, как на этой странице, это не работает. Мне нужно соединить изображение с правой строкой данных таблицы.
Вот тип строк xpath_query, которые я использую в Google таблицах, где A1 содержит URL.
=importXML(A1,"//tbody//img/@src")
=importXML(A1,"//tbody//tr")
Спасибо за любую помощь.
Комментарии:
1. Какой точный результат вы хотите получить? Можете ли вы уточнить?
2. Когда я писал «Мне нужно соединить изображение с правой строкой данных таблицы», я имел в виду, например, что мне нужно знать, что изображение в строке 3 совпадает с текстом в строке 3 и т.д. для каждой строки. Другими словами, я хочу воспроизвести таблицу так, как она выглядит, в электронной таблице. В нынешнем виде я не могу этого сделать — из-за отсутствия изображений некоторые изображения и текст строки смещаются, появляясь в разных строках.
Ответ №1:
Более короткая альтернатива с фильтрацией XPath (URL в C2
, формула в I27
) :
=ARRAYFORMULA({{"figura:";IMAGE("https://www.patentati.it/"amp;IMPORTXML(C2;"//tr//img/@src|//tr[not(.//img)]/td[@class='domanda']"))}QUERY(IMPORTHTML(C2;"table";1);"select Col2,Col3")})
Вывод :
Примечание: Я живу в Европе. Формула для языков США :
=ARRAYFORMULA({{"figura:";IMAGE("https://www.patentati.it/"amp;IMPORTXML(C2,"//tr//img/@src|//tr[not(.//img)]/td[@class='domanda']"))},QUERY(IMPORTHTML(C2,"table",1),"select Col2,Col3")})
Комментарии:
1. Теперь я протестировал это решение на 7 страницах с разным количеством присутствующих или отсутствующих изображений, и оно работает каждый раз. Поэтому, хотя я ценю все, что я узнал от @player0, я должен отметить это как правильный ответ. Кроме того, это кажется (по крайней мере, мне, самым простым). (Кстати, у меня работала только версия для США; хотя я в Европе, у меня, должно быть, все еще настроено в США). Вы оба многому меня научили. Я действительно ценю всю помощь!
2. Ваше решение отлично работает по одному за раз. Но когда я пытаюсь выполнить этот вызов по 30 различным ссылкам на одном листе, это занимает более 30 минут (я не знаю точно, потому что я все еще жду). Есть предложения о том, как этим управлять? Я пытался посмотреть здесь, но это мне не помогло: benlcollins.com/spreadsheets/slow-google-sheets/#13
3. Это потому, что у вас есть много
IMPORTXML
иIMPORTHTML
функций на одном листе. Кроме уменьшения количества ссылок, я не думаю, что вы можете что-либо с этим сделать. Вы можете взглянуть наIMPORTFROMWEB
дополнение, которое может поддерживать больше запросов (вам нужно изучить основы (используяbaseSelector
). Список цен: nodatanobusiness.com/importfromweb/pricing4.
IMPORTFROMWEB
синтаксис :=ARRAYFORMULA({{"figura:";IMAGE("https://www.patentati.it/"amp;IMPORTXML(C2,"//tr//img/@src|//tr[not(.//img)]/td[@class='domanda']"))},{IMPORTFROMWEB(C2,"//td[@class='domanda' or .='Domanda']")},{IMPORTFROMWEB(C2,"//td[@class='risp' or .='Risposta']")}})
Ответ №2:
вот так:
=ARRAYFORMULA(IMAGE("https://www.patentati.it"amp;TRIM(SUBSTITUTE(FLATTEN(
SPLIT(QUERY(IFNA(REGEXEXTRACT(QUERY(ARRAY_CONSTRAIN(IMPORTDATA(A1), 500, 1),
"where Col1 matches '.*zoomImage.*|.*rowspan.*'"),
"src=""(. png)"), "♀♫"),,9^9), "♫")), "♀", ))))
и целая таблица:
=ARRAYFORMULA({{"figura"; IMAGE("https://www.patentati.it"amp;TRIM(SUBSTITUTE(FLATTEN(
SPLIT(QUERY(IFNA(REGEXEXTRACT(QUERY(ARRAY_CONSTRAIN(IMPORTDATA(A1), 500, 1),
"where Col1 matches '.*zoomImage.*|.*rowspan.*'"),
"src=""(. png)"), "♀♫"),,9^9), "♫")), "♀", )))},
QUERY(IMPORTHTML(A1, "table", 1), "select Col2,Col3", 0)})
Комментарии:
1. Этот ответ настолько чрезмерен, что я с трудом могу в это поверить. Мой вопрос казался таким простым, но, думаю, я понятия не имел. Итак, я впечатлен. Спасибо. С другой стороны, я не вижу способа применить это к другим случаям. Получить текст так просто, но сопоставление текста с изображениями, по-видимому, находится в совершенно другой области. Есть ли какой-либо более простой способ сопоставить изображения с текстом строки? Мне не нужен elegant. Еще раз спасибо.
2. веб-очистка в Google sheets редко бывает общей. большинство сайтов полны элементов JS, поэтому она действительно индивидуальна для каждого отдельного сайта. (в 1999 году вы бы получили все с помощью простого XPath / IMPORTXML). в этом ответе используется непосредственно исходный код (через IMPORTDATA) сайта, чтобы получить эти изображения в правой строке
3. Я вижу, вы знаете, о чем говорите, но не могли бы вы, пожалуйста, попытаться рассмотреть что-то очень простое: мне кажется, команда, которую я использовал, =ImportXML(A1,»//tbody //img / @src»), вызвала пропуск строк, потому что в этой строке не было атрибута <img src. Поэтому, если бы был способ заставить его найти что-то еще в этой строке, просто чтобы заполнить этот пробел, тогда все изображения попали бы в нужную строку. Я знаю, что это «взлом», но я просто не на том уровне, на котором находитесь вы, и это все, что мне нужно на данный момент. Простота может быть прекрасной вещью, когда вы не эксперт. Спасибо.
4. это именно то, что там происходит. ваша короткая формула IMPORTXML эквивалентна i.stack.imgur.com/NLLZr.png . и чтобы включить пропущенные строки, мы просто добавляем
|.*rowspan.*
в запрос: i.stack.imgur.com/27yLC.png