【问题标题】:How to use a conditional statement while scraping?抓取时如何使用条件语句?
【发布时间】:2019-02-03 01:54:25
【问题描述】:

我正在尝试抓取 MTA 网站,需要一些帮助来抓取“Train Lines Row”。 (参考网址:https://advisory.mtanyct.info/EEoutage/EEOutageReport.aspx?StationID=All

火车线路信息存储为图像文件(1 线地铁、A 线地铁等),描述可通过特定车站访问的每条线路。我已经成功地从只有一列火车通过的行中刮取信息,但是我很难弄清楚如何遍历有多列火车通过的列...使用条件语句来测试是否它有一行或多行。

tableElements = table.find_elements_by_tag_name('tr') 

这是我正在迭代的表

tableElements[2].find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_element_by_tag_name('img').get_attribute('alt')

如果特定列中仅存在一个值,这将成功地为我提供值

tableElements[8].find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_elements_by_tag_name('img')

这成功地为我提供了一个值列表,我可以成功地迭代以提取我需要的值。

现在我尝试将这些代码行组合在一个 forloop 中,以不间断地提取所有信息。

for info in tableElements[1:]:
 if info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_elements_by_tag_name('img')[1] == True:
    for images in info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_elements_by_tag_name('img'):
        print(images.get_attribute('alt'))
 else:
    print(info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_element_by_tag_name('img').get_attribute('alt'))

我收到错误消息:“列表索引超出范围。”我不知道为什么,因为孤立地完成的每一次迭代似乎都有效。我的预感是我在这里没有正确使用布尔运算。我的想法是,如果 find_elements_by_tag_name 的索引为 [1],这意味着我需要遍历多个图像文本。因此,我为什么要使用这个布尔运算。

大家好,非常感谢您的帮助。我已将我的完整代码上传到 Github 并附上一个链接供您参考:https://github.com/tsp2123/MTA-Scraping/blob/master/MTA.ElevatorData.ipynb

最终目标是使用某种公式将这些信息放入数据框中,并使用 for 循环提取我想要的图像信息。

dataframe = []
for elements in tableElements:
  row = {}
  columnName1 = find_element_by_class_name('td')
  ..

【问题讨论】:

  • 你能提供你正在使用的完整代码吗?

标签: python-3.x selenium web-scraping


【解决方案1】:

你的逻辑不在这里。

“我的直觉是我在这里没有正确使用布尔运算。我的想法是,如果 find_elements_by_tag_name 的索引为 [1],这意味着我需要遍历多个图像文本。”

问题是如果索引位置 [1] 中没有任何内容,则无法检查语句是否为 True。因此在这一点上的错误。

 if info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_elements_by_tag_name('img')[1] == True:

你想要做的是使用try: 所以类似:

tableElements[1:] 中的信息:

try:

    if info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_elements_by_tag_name('img')[1] == True:
        for images in info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_elements_by_tag_name('img'):
            print(images.get_attribute('alt'))
    else:
        print(info.find_elements_by_tag_name('td')[1].find_element_by_tag_name('h4').find_element_by_tag_name('img').get_attribute('alt'))

except:
    #do something else
    print ('Nothing found in index position.')

是否也可以回到您的问题并提供完整的代码?当我尝试这个时,我得到了 11 个表格元素,所以想用你要抓取的特定表格来测试它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2017-03-23
    • 2011-06-21
    • 2021-02-22
    相关资源
    最近更新 更多