Цикл for с кодом lxml, используемым для очистки, показывает ошибку «индекс списка вне диапазона», но работает для 2 экземпляров - PullRequest
0 голосов
/ 04 января 2019

мы новички в питоне. У нас есть список ссылок / веб-сайтов с высказываниями Дональда Трампа. Каждая ссылка представляет собой целое интервью / речь и т. Д. Теперь мы хотим получить доступ к этим сайтам, очистить их и создать текстовый файл для каждой ссылки. На данный момент наш код делает это для 2 или 3 ссылок, но затем просто показывает эту ошибку:

Traceback (most recent call last):
 File "C:\Users\Lotte\AppData\Local\Programs\Python\Python37\Code\Corpus_create\Scrapen und alle inhalte laden und speichern - zusammengefügt.py", line 79, in <module>
Trump=(tree.xpath('//div[@class="media topic-media-row mediahover "]/div[3]/div/div[2]/a')[item2].text_content())
IndexError: list index out of range

мы экспериментировали с элементом index, пробовали [0] или даже опускали его. ничего не получалось. Затем мы попытались запустить код только с одной ссылкой и без первого цикла, который прекрасно работает

import lxml
from lxml import html
from lxml.html import fromstring
import requests
import re
Linklist=['https://factba.se/transcript/donald-trump-remarks-briefing-room-border-security-january-3-2019', 'https://factba.se/transcript/donald-trump-remarks-cabinet-meeting-january-2-2019', 'https://factba.se/transcript/donald-trump-remarks-military-briefing-iraq-december-26-2018', 'https://factba.se/transcript/donald-trump-remarks-videoconference-troops-christmas-december-25-2018', 'https://factba.se/transcript/donald-trump-remarks-justice-reform-december-21-2018', 'https://factba.se/transcript/donald-trump-remarks-agriculture-bill-december-20-2018', 'https://factba.se/transcript/donald-trump-remarks-roundtable-school-safety-december-18-2018', 'https://factba.se/transcript/donald-trump-remarks-governors-elect-white-house-december-15-2018', 'https://factba.se/transcript/donald-trump-remarks-governors-elect-white-house-december-13-2018', 'https://factba.se/transcript/donald-trump-remarks-revitalization-council-executive-order-december-12-2018', 'https://factba.se/transcript/donald-trump-remarks-meeting-pelosi-schumer-december-11-2018', 'https://factba.se/transcript/donald-trump-remarks-bill-signing-genocide-december-11-2018', 'https://factba.se/transcript/donald-trump-remarks-chanukah-evening-reception-december-6-2018', 'https://factba.se/transcript/donald-trump-remarks-chanukah-afternoon-reception-december-6-2018', 'https://factba.se/transcript/donald-trump-remarks-bilat-china-xi-buenos-aires-december-1-2018', 'https://factba.se/transcript/donald-trump-remarks-bilat-germany-merkel-december-1-2018', 'https://factba.se/transcript/donald-trump-remarks-usmca-mexico-canada-buenos-aires-november-30-2018', 'https://factba.se/transcript/donald-trump-remarks-bilat-argentina-macri-november-30-2018', 'https://factba.se/transcript/donald-trump-remarks-bilat-morrison-australia-november-30-2018', 'https://factba.se/transcript/donald-trump-remarks-trilat-japan-india-abe-modi-november-30-2018']


for item in Linklist:
    headers= {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"}
    page = requests.get(item, headers=headers)
    tree = html.fromstring(page.content)


#loads everything trump said

    Text=[]
    for item2 in range(len(tree.xpath('//div[@class="media topic-media-row mediahover "]'))):
        Trump=(tree.xpath('//div[@class="media topic-media-row mediahover "]/div[3]/div/div[2]/a')[item2].text_content())
        Text.append(Trump)

    print(Text, '\n')

мы хотим только превзойти высказывания из каждой ссылки

1 Ответ

0 голосов
/ 04 января 2019

Вот модифицированная версия вашего скрипта.

code.py

from lxml import html
import requests
import re
from pprint import pprint


url_list = [
    "https://factba.se/transcript/donald-trump-remarks-briefing-room-border-security-january-3-2019",
    "https://factba.se/transcript/donald-trump-remarks-cabinet-meeting-january-2-2019",
    "https://factba.se/transcript/donald-trump-remarks-military-briefing-iraq-december-26-2018",
    "https://factba.se/transcript/donald-trump-remarks-videoconference-troops-christmas-december-25-2018",
    "https://factba.se/transcript/donald-trump-remarks-justice-reform-december-21-2018",
    "https://factba.se/transcript/donald-trump-remarks-agriculture-bill-december-20-2018",
    "https://factba.se/transcript/donald-trump-remarks-roundtable-school-safety-december-18-2018",
    "https://factba.se/transcript/donald-trump-remarks-governors-elect-white-house-december-15-2018",
    "https://factba.se/transcript/donald-trump-remarks-governors-elect-white-house-december-13-2018",
    "https://factba.se/transcript/donald-trump-remarks-revitalization-council-executive-order-december-12-2018",
    "https://factba.se/transcript/donald-trump-remarks-meeting-pelosi-schumer-december-11-2018",
    "https://factba.se/transcript/donald-trump-remarks-bill-signing-genocide-december-11-2018",
    "https://factba.se/transcript/donald-trump-remarks-chanukah-evening-reception-december-6-2018",
    "https://factba.se/transcript/donald-trump-remarks-chanukah-afternoon-reception-december-6-2018",
    "https://factba.se/transcript/donald-trump-remarks-bilat-china-xi-buenos-aires-december-1-2018",
    "https://factba.se/transcript/donald-trump-remarks-bilat-germany-merkel-december-1-2018",
    "https://factba.se/transcript/donald-trump-remarks-usmca-mexico-canada-buenos-aires-november-30-2018",
    "https://factba.se/transcript/donald-trump-remarks-bilat-argentina-macri-november-30-2018",
    "https://factba.se/transcript/donald-trump-remarks-bilat-morrison-australia-november-30-2018",
    "https://factba.se/transcript/donald-trump-remarks-trilat-japan-india-abe-modi-november-30-2018"
]

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"
}

media_row_xpath_marker = '//div[@class="media topic-media-row mediahover "]'
normal_xpath_marker = media_row_xpath_marker + "/div[3]/div/div[2]/a"
movieless_xpath_marker = media_row_xpath_marker + "/div[3]/div/div/a"

xpath_markers = [
    normal_xpath_marker,
    movieless_xpath_marker,
]


for url_index, url in enumerate(url_list):
    page = requests.get(url, headers=headers)
    tree = html.fromstring(page.content)
    lines = []
    media_row_list = tree.xpath(media_row_xpath_marker)
    if media_row_list:
        for xpath_marker in xpath_markers:
            post_list = tree.xpath(xpath_marker)
            if post_list:
                lines = [item.text_content() for item in post_list]
                break
    #pprint(lines)
    print("URL index: {0:02d} - Article count: {1:03d}".format(url_index, len(lines)))

Примечания

  • Проблема в том, что 3 rd URL немного отличается от других, если вы посмотрите на него, это не так YouTube , поэтому xpath не совпадает. Это в сочетании с отсутствием проверки пустого списка дало указанное выше исключение. Сейчас предпринимаются 2 паттерна:

    • movieless_xpath_marker - который будет работать для "неисправной" страницы
    • normal_xpath_marker - который будет работать на остальных (это попытка 1 st )

    Когда один шаблон вызывает некоторые результаты, просто игнорируйте остальные (если есть)

  • Я также изменил код:
    • Избавился от цикла (и операции бесполезно выполнялись несколько раз)
    • Переименование переменной
    • Постоянное извлечение
    • Стиль кода
    • Другие незначительные изменения

Вывод (отображение количества статей для каждого URL ):

(py_064_03.06.08_test0) e:\Work\Dev\StackOverflow\q054043232>"e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
URL index: 00 - Article count: 018
URL index: 01 - Article count: 207
URL index: 02 - Article count: 063
URL index: 03 - Article count: 068
URL index: 04 - Article count: 080
URL index: 05 - Article count: 051
URL index: 06 - Article count: 045
URL index: 07 - Article count: 014
URL index: 08 - Article count: 036
URL index: 09 - Article count: 022
URL index: 10 - Article count: 105
URL index: 11 - Article count: 020
URL index: 12 - Article count: 025
URL index: 13 - Article count: 028
URL index: 14 - Article count: 010
URL index: 15 - Article count: 012
URL index: 16 - Article count: 015
URL index: 17 - Article count: 005
URL index: 18 - Article count: 005
URL index: 19 - Article count: 006
...